Embora o exemplo Shez acima seja uma boa maneira padrão de capturar erros da maioria dos programas baseados em DOS que definem ERRORLEVEL e produzem resultados de erro padrão (2 >), ftp.exe fora da caixa do MS não define ERRORLEVEL. ERRORLEVEL permanece zero se o script (-s: parameter) for bem-sucedido ou falhar. Redirecionando erro padrão (2 >) para "% ERRORFILE%" não funciona como este arquivo sempre será um arquivo de zero byte (porque ftp.exe sempre retorna ERROR_SUCCESS ou 0) para apenas um arquivo vazio é criado. Então a string de comando:
ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%"
nunca produzirá os resultados esperados. Se formos forçados a usar o cliente FTP da Microsoft, a melhor aposta é analisar o% OUTPUTFILE% para determinadas cadeias de texto que indicam um erro ou usar um cliente FTP diferente do MS (como o IPSWITCH WS_FTP) que permite uma melhor interceptação de erros. Vou acompanhar com exemplos de código de como analisar o% OUTPUTFILE% em algumas horas, depois de terminar de codificá-lo como a força bruta. Obrigado!
Acompanhamento
Veja meu segundo post abaixo para obter uma amostra da sessão de FTP da Microsoft. Exemplo de análise é o próximo ... OK, o que segue é uma variação do Martijn S postado em stackoverflow.com aqui . Minha solução usa FINDSTR e um arquivo de texto separado contendo critérios de pesquisa:
Crie um arquivo de texto (FTP_ERR_SEARCH_CRITERIA.txt) contendo as seguintes sequências de texto:
not connected
not found
failed
Chame a seguinte sub-rotina do seu arquivo de lote / comando:
::
::=============================================================================
:WIN_FTP_ERROR %1=%_SearchCriteria% %2=%_InputFile%
::=============================================================================
::
set _SearchCriteria=%1
set _InputFile=%2
set _tokens="tokens=*"
for /F %_tokens% %%G in ('findstr /I /G:%_SearchCriteria% %_InputFile%') do @echo "%%G"
exit /b
A chamada:
call :WIN_FTP_ERROR ".\FTP_ERR_SEARCH_CRITERIA.txt" %OUTPUTFILE%
Exemplo de saída FTP da Microsoft
Continuando de onde parei ... Às vezes, a melhor maneira de descobrir como algo funciona é testá-lo por conta própria, em vez de confiar na grande quantidade de desinformação encontrada na Internet. Então aqui vai. O exemplo abaixo mostra dois arquivos diferentes: tst.txt e tst.tx (diferença sutil no nome, mas diferente da mesma forma). O arquivo tst. txt existe enquanto o tst. tx não.
Exemplo de FTP da Microsoft (espaçamento adicionado para maior clareza):
ftp> put tst.txt
200 PORT command successful.
150 Opening ASCII mode data connection for tst.txt.
226 Transfer complete.
ftp: 44 bytes sent in 0.19Seconds 0.24Kbytes/sec.
ftp> put tst.tx
tst.tx: File not found
ftp> get tst.tx
200 PORT command successful.
550 tst.tx: The system cannot find the file specified.
ftp> get tst.txt
200 PORT command successful.
150 Opening ASCII mode data connection for tst.txt(44 bytes).
226 Transfer complete.
ftp: 44 bytes received in 0.00Seconds 44000.00Kbytes/sec.
Observe como o sistema de arquivos local e o sistema de arquivos remotos respondem aos comandos acima:
Para o primeiro comando colocar tst. txt (o arquivo existe no sistema de arquivos local), vemos que o servidor remoto responde transferindo o arquivo.
para o segundo comando colocar tst. tx (o arquivo tst.tx não existe em nenhum dos sistemas), vemos que o sistema de arquivos local responde com o nome de arquivo < strong> tst.tx e a mensagem de erro Arquivo não encontrado
para o terceiro comando get tst. tx (novamente o arquivo tst.tx não existe), vemos que o sistema de arquivos remoto (na verdade, host FTP remoto) responde com o código de erro do FTP 550 , o nome do arquivo tst.tx e a mensagem de erro O sistema não pode encontrar o arquivo especificado.
para o quarto e último comando get tst. txt (o arquivo agora existe no sistema remoto), vemos que o sistema remoto responde com uma transferência bem-sucedida. / p>
Por que toda essa explicação? É importante quando analisamos o arquivo no post anterior para ver quais mensagens de erro estão retornando do MS ftp.exe.