Como faço para verificar o resultado de um script de ftp com um arquivo bat? [fechadas]

3

Eu tenho um arquivo .bat que executa um script de ftp, pegando arquivos do servidor e copiando-os para minha máquina. Funciona bem.

Eu quero agora este arquivo .bat para relatar se algum desses erros ocorreu

Se você pudesse me apontar na direção certa para a ideia geral de como fazer isso, seria ótimo.

Obrigado.

    
por Tommy 21.01.2010 / 20:38

5 respostas

4

Para ser honesto, nunca tive sucesso usando scripts FTP fixos. Mesmo que você lide com os códigos de retorno, é difícil saber exatamente o que deu errado.

Eu recomendaria usar o PowerShell ou o Python para o trabalho. Ambos têm acesso a um cliente FTP que pode ser controlado dinamicamente. Você saberá exatamente o que funcionou ou falhou e será capaz de lidar com o problema de vez em quando.

Exemplo simples em PS

$url = "ftp://ftp.foo.com/bar.txt"
$destination = "c:\foo\bar.txt"
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($url, $destination)

Se você precisar fazer coisas mais complicadas, comece analisando o link Esses exemplos estão em C #, mas deve ser muito fácil convertê-los em PS.

Um script construído dessa maneira pode listar um diretório e fazer um loop pelos arquivos que você quer baixar. Se houver algum erro, você poderá manipulá-los em um nível por arquivo, como quiser.

    
por 21.01.2010 / 23:13
2

Veja como fazer isso em um arquivo BAT.

Chame o FTP, redirecionando a saída e os erros para arquivos separados. Se o arquivo de erro não for em branco, haverá um problema.

Supondo que você criou set variáveis chamadas FTPFILE , OUTPUTFILE e ERRORFILE , então o seguinte deve funcionar:

  1. Chame o FTP, capturando resultados e erros para separar arquivos.

    ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%"
    
  2. Verifique se a chamada de FTP falhou

    if  ERRORLEVEL 1 (
        echo Call to ftp returned an error. See file: %OUTPUTFILE%
        exit /b 1
    )
    
  3. Verifique se a sessão de FTP continha erros. Faça isso verificando o tamanho do arquivo de erros.

    FOR /F "usebackq" %%A IN ('%ERRORFILE%') DO set ERRORFILESIZE=%%~zA
    if %ERRORFILESIZE% GTR 0 ( 
        echo Error while performing the FTP. See file: %ERRORFILE%
        exit /b 2
    )
    
por 09.11.2012 / 11:20
2

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.

    
por 07.08.2014 / 18:32
1

É comum que os utilitários do console retornem algum código indicando que o erro ocorreu; eles são descritos, por exemplo, aqui . Se ftp sair depois de algum erro, provavelmente retornará um código diferente de zero indicando falha. IMHO não há maneira simples de analisar a saída de um programa em arquivos em lote, mas você pode verificar errorlevel e salvar um arquivo de log (usando o redirecionamento de fluxo de saída: command args >log ) ou enviá-lo por e-mail.

    
por 21.01.2010 / 20:59
1

Essa mensagem de erro é um erro específico do FTP e é porque o seu firewall desativará por padrão Conexões FTP (isso é uma coisa boa!).

Você pode ignorar esta mensagem, pois ela não afetará seu computador de maneira alguma.

    
por 03.02.2011 / 07:56