Escrevendo arquivo com lote, mas o texto está desaparecendo

2

Eu tenho um problema com a gravação de um arquivo com um arquivo em lotes. Parece que um personagem está acionando o eco como este: o código é um downloader.

C:\ProgramData\Tempfolder\test.vbs ECHO if WScript.Arguments.Count < 1 then

Mas a saída do arquivo é essa.

if WScript.Arguments.Count  then

Aqui está o meu código:

mkdir C:\ProgramData\Tempfolder


>> C:\ProgramData\Tempfolder\test.vbs ECHO if WScript.Arguments.Count <1 then
>> C:\ProgramData\Tempfolder\test.vbs ECHO   MsgBox "Usage: wget.vbs <url> (file)"
>> C:\ProgramData\Tempfolder\test.vbs ECHO   WScript.Quit
>> C:\ProgramData\Tempfolder\test.vbs ECHO end if
>> C:\ProgramData\Tempfolder\test.vbs ECHO URL = WScript.Arguments(0)
>> C:\ProgramData\Tempfolder\test.vbs ECHO if WScript.Arguments.Count > 1 then
>> C:\ProgramData\Tempfolder\test.vbs ECHO   saveTo = WScript.Arguments(1)
>> C:\ProgramData\Tempfolder\test.vbs ECHO else
>> C:\ProgramData\Tempfolder\test.vbs ECHO   parts = split(url,"/") 
>> C:\ProgramData\Tempfolder\test.vbs ECHO   saveTo = parts(ubound(parts))
>> C:\ProgramData\Tempfolder\test.vbs ECHO end if
>> C:\ProgramData\Tempfolder\test.vbs ECHO Set objXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
>> C:\ProgramData\Tempfolder\test.vbs ECHO objXMLHTTP.open "GET", URL, false
>> C:\ProgramData\Tempfolder\test.vbs ECHO objXMLHTTP.send()
>> C:\ProgramData\Tempfolder\test.vbs ECHO If objXMLHTTP.Status = 200 Then
>> C:\ProgramData\Tempfolder\test.vbs ECHO Set objADOStream = CreateObject("ADODB.Stream")
>> C:\ProgramData\Tempfolder\test.vbs ECHO objADOStream.Open
>> C:\ProgramData\Tempfolder\test.vbs ECHO objADOStream.Type = 1 'adTypeBinary
>> C:\ProgramData\Tempfolder\test.vbs ECHO objADOStream.Write objXMLHTTP.ResponseBody
>> C:\ProgramData\Tempfolder\test.vbs ECHO objADOStream.Position = 0    'Set the stream position to the start
>> C:\ProgramData\Tempfolder\test.vbs ECHO Set objFSO = Createobject("Scripting.FileSystemObject")
>> C:\ProgramData\Tempfolder\test.vbs ECHO If objFSO.Fileexists(saveTo) Then objFSO.DeleteFile saveTo
>> C:\ProgramData\Tempfolder\test.vbs ECHO Set objFSO = Nothing
>> C:\ProgramData\Tempfolder\test.vbs ECHO objADOStream.SaveToFile saveTo
>> C:\ProgramData\Tempfolder\test.vbs ECHO objADOStream.Close
>> C:\ProgramData\Tempfolder\test.vbs ECHO Set objADOStream = Nothing
>> C:\ProgramData\Tempfolder\test.vbs ECHO End if
>> C:\ProgramData\Tempfolder\test.vbs ECHO Set objXMLHTTP = Nothing
>> C:\ProgramData\Tempfolder\test.vbs ECHO WScript.Quit
start C:\ProgramData\Tempfolder\test.vbs (link goes here )

E toda a saída de eco é essa

if WScript.Arguments.Count  then      <---- some numbers are missing 
MsgBox "Usage: wget.vbs <url> (file)"
WScript.Quit
end if
URL = WScript.Arguments(0)              <------- 1 line is missing 
saveTo = WScript.Arguments(1)
else
parts = split(url,"/") 
saveTo = parts(ubound(parts))
end if
Set objXMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
objXMLHTTP.open "GET", URL, false
objXMLHTTP.send()
If objXMLHTTP.Status = 200 Then
Set objADOStream = CreateObject("ADODB.Stream")
objADOStream.Open
objADOStream.Type = 1 'adTypeBinary
objADOStream.Write objXMLHTTP.ResponseBody
objADOStream.Position = 0    'Set the stream position to the start
Set objFSO = Createobject("Scripting.FileSystemObject")
If objFSO.Fileexists(saveTo) Then objFSO.DeleteFile saveTo
Set objFSO = Nothing
objADOStream.SaveToFile saveTo
objADOStream.Close
Set objADOStream = Nothing
End if
Set objXMLHTTP = Nothing
WScript.Quit

Como você pode ver, falta uma linha no texto com eco. Existe algum tipo de caractere inicial e final para que eu possa ecoar comandos como esses?

Eu ficaria feliz se alguém pudesse responder minha pergunta.

    
por Deniel Zurbi 25.08.2015 / 21:12

1 resposta

2

Usando >> C:\ProgramData\Tempfolder\test.vbs ECHO if WScript.Arguments.Count <1 then como o exemplo ....

Se você tentar esta linha específica por si só, formar um prompt de comando, ele irá falhar com um erro "O sistema não pode encontrar o arquivo especificado".

Isso porque ele está lendo o <1 como um comando de entrada de arquivo (oposto da saída > ).

Então você teria que 'escapar' do < para que ele seja tratado como um caractere de texto simples no Echo, e não como um comando de redirecionamento de entrada de arquivo.

Ou seja, para este caso, você gostaria de usar:

>> C:\ProgramData\Tempfolder\test.vbs ECHO if WScript.Arguments.Count ^<1 then  

O mesmo com

>> C:\ProgramData\Tempfolder\test.vbs ECHO if WScript.Arguments.Count > 1 then

Você gostaria de escapar do > naquele:

>> C:\ProgramData\Tempfolder\test.vbs ECHO if WScript.Arguments.Count ^> 1 then

O ^ é o caractere de escape em lote, e você deve manter isso em mente para cada linha que estiver ecoando, caso seja necessário.

De link :

^ Escape character.

Adding the escape character before a command symbol allows it to be treated as ordinary text. When piping or redirecting any of these charcters you should prefix with the escape character: & \ < > ^ |

 e.g.  ^\  ^&  ^|  ^>  ^<  ^^
    
por 25.08.2015 / 21:22