Come faccio a controllare l'esito di uno script ftp con un file bat?

Ho un file .bat che esegue uno script ftp, afferrando i file dal server e copiandoli sulla mia macchina. Funziona alla grande.

Ora desidero che questo file .bat segnalare se uno di questi errori si è verificato.

Se potessi indicarmi nella giusta direzione per l'idea generale di come fare questo, sarebbe fantastico.

Grazie.

Per essere onesti non ho mai avuto un grande successo utilizzando script FTP fisso. Anche se si occupano dei codici di return è difficile sapere esattamente cosa è andato storto.

Suggerii invece di usare PowerShell o Python per il lavoro. Entrambi questi hanno accesso a un client FTP che può essere controllato dynamicmente. Saprai esattamente cosa funzionava o fallì e potrà affrontare la questione allora e là.

Semplice esempio in PS

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

Se hai bisogno di fare cose più complicate, iniziavo guardando http://msdn.microsoft.com/en-us/library/ms229718.aspx Questi esempi sono in C #, ma dovrebbe essere abbastanza facile da convertire in PS.

Uno script creato in questo modo può elencare un dir e loop sui file che scaricano quelli che si desidera. Se ci sono degli errori è ansible gestirli su un livello di file a piacere.

Ecco come farlo in un file BAT.

Chiama FTP, mentre reindirizza l'output e gli errori per separare i file. Se il file di errore non è stato eseguito, è presente un problema.

Supponendo di aver creato le variables set denominate FTPFILE , OUTPUTFILE e ERRORFILE , dovresti funzionare come segue:

  1. Chiama FTP, cattura l'output e gli errori per separare i file.

     ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%" 
  2. Controllare se la chiamata FTP non è rioutput

     if ERRORLEVEL 1 ( echo Call to ftp returned an error. See file: %OUTPUTFILE% exit /b 1 ) 
  3. Controllare se la session FTP conteneva errori. Fai questo controllando la dimensione del file di errore.

     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 ) 

Mentre l' esempio di Shez sopra è un buon modo standard per catturare gli errori da più programmi basati su dos che impostano ERRORLEVEL e producono output da errore standard (2>), http://ftp.exe fuori dalla scatola da MS non imposta ERRORLEVEL. ERRORLEVEL rimane zero se lo script (-s: parametro) riesce o non riesce. Il reindirizzamento dell'errore standard (2>) a "% ERRORFILE%" non funziona, poiché questo file sarà sempre un file di byte zero (perché http://ftp.exe restituisce sempre ERROR_SUCCESS o 0), quindi viene creato solo un file vuoto. Così la string di command:

 ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%" 

non produrrà mai i risultati attesi. Se siamo costretti a utilizzare il client FTP Microsoft, la migliore scommessa è analizzare il% OUTPUTFILE% per determinate stringhe di text che indicano un errore o utilizzano un client FTP diverso da quello di MS (come IPSWITCH WS_FTP) che consente una migliore cattura degli errori. Farò seguito con esempi di codice su come analizzare il% OUTPUTFILE% in poche ore una volta finito di codificarlo in modo bruto forza. Grazie!

Seguito

Vedi il mio secondo post qui sotto per la session intertriggers di FTP di Microsoft. L'esempio di analisi è successivo … OK quello che segue è una variazione sul post di Martijn S su stackoverflow.com qui . La mia soluzione utilizza FINDSTR e un file di text separato contenente i criteri di ricerca:

Creare un file di text (FTP_ERR_SEARCH_CRITERIA.txt) contenente le seguenti stringhe di text:

 not connected not found failed 

Chiamate la seguente sottoprogramma dal file batch / command:

 :: ::============================================================================= :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 

La chiamata:

 call :WIN_FTP_ERROR ".\FTP_ERR_SEARCH_CRITERIA.txt" %OUTPUTFILE% 

Esempio di output di Microsoft FTP

Continuando where sono partito … A volte il modo migliore per scoprire come funziona qualcosa è testare da soli, piuttosto che contare sulla pletora di disinformazione trovata su Internet. Quindi qui va. L'esempio riportto di seguito mostra due file diversi: tst.txt e tst.tx (differenza sottile nel nome, ma diversi solo lo stesso). Il tst. esiste il file txt mentre il tst. tx non lo fa.

Esempio di Microsoft FTP (spaziatura aggiunta per chiarezza):

 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. 

Notare come il sistema di file locale e il file system remoto rispondono ai comandi sopra indicati:

per la prima volta tst. Il command txt (il file esiste nel file system locale) vediamo che il server remoto risponde trasferendo il file.

per il secondo put tst. command tx (il file tst.tx non esiste in entrambi i sisthemes) vediamo che il file system locale risponde con il nome del file tst.tx e il messaggio di errore File non trovato

per il terzo arrivare tst. Il command tx (ancora il file tst.tx non esiste) vediamo che il file system remoto (in realtà l'host FTP remoto) risponde con il codice di errore FTP 550 , il nome del file tst.tx e il messaggio di errore Il sistema non riesce a trovare il file specificato .

per il quarto e ultimo arrivare tst. Il command txt (il file esiste ora sul sistema remoto) vediamo che il sistema remoto risponde con un trasferimento di successo.

Perché tutta questa spiegazione? È importnte quando analizziamo il file nel post precedente per vedere che i messaggi di errore stanno tornando da MS http://ftp.exe.

È comune per gli utilità della console di restituire un codice che indica che l'errore è accaduto, sono descritti ad esempio qui . Se l' ftp esce dopo qualche errore, probabilmente restituisce un codice non zero che indica l'errore. IMHO non esiste un modo semplice per analizzare l'output di un programma in file batch, ma è ansible controllare l'errorlevel e salvare un file di registro (usando il redirection stream stream: command args >log ) o inviarlo tramite email.

Quel messaggio di errore è un errore specifico FTP e è perché il firewall, per impostazione predefinita, disabilita le connessioni FTP (questa è una buona cosa!).

È ansible ignorare questo messaggio poiché non influisce in alcun modo sul computer.