如何在Windows ftp脚本中捕获错误条件?

时间:2015-07-15 22:06:56

标签: batch-file ftp

我正在使用Windows批处理脚本自动运行ftp脚本。我想运行的ftp命令集保存在文件中。

示例:

@echo off 
ftp -n -i -s:c:\temp\myftpscriptfile.ftp

我已使用%ERRORLEVEL%语法成功捕获批处理命令中的错误条件。我的挑战是ftp脚本命令总是返回ERRORLEVEL为0,即使脚本中的命令失败也是如此。

我很难搞清楚当ftp脚本内部发生错误时如何实际返回或陷阱。它只会盲目地执行命令,即使我能看到屏幕上出现的错误,我也无法将它们捕获为ERRORLEVEL ..

尝试脚本的示例屏幕截图,无法登录,然后回显显示零的ERRORLEVEL ..

ftp> open fubar.test.com
Unknown host fubar.test.com
ftp> user test test
Not connected.
ftp> ascii
Not connected.
ftp> cd /home/test/dirname
Not connected.
ftp> mput C:\Test\test*.txt
Not connected.
ftp> close
Not connected.
ftp> quit
.0

2 个答案:

答案 0 :(得分:1)

使用find

ftp -n -i -s:c:\temp\myftpscriptfile.ftp 2>&1|find "Unknown host">nul
if %errorlevel%==0 (
  echo Error!
)

答案 1 :(得分:1)

使用ftp命令解析for /F通信。下一个脚本中的可能方法。警告:据说在给定的测试序列中不存在一些ftp错误消息。当然,您可以测试正面 ftp消息而不是......

@ECHO OFF >NUL
SETLOCAL enableextensions enabledelayedexpansion
set "errsftp=0"
ftp -n -i -s:c:\temp\myftpscriptfile.ftp >c:\temp\31442020.err 2>&1
for /F "tokens=1*" %%G in (c:\temp\31442020.err) do (
  rem echo %%G [%%H]
  if "%%G"=="ftp>" (
    set "line=%%H"
    set "errs=0"
  ) else (
    set "reply=%%G %%H"
    Call :testreply Unknown host
    Call :testreply Connection timed out
    Call :testreply Not connected
    rem insert next tests here
    if !errs! EQU 0 echo !line! =looks OK= !reply!
  )
)
echo(
echo :errors total: %errsftp%

ENDLOCAL
goto :eof

:testreply
    set "ylper=!reply:%*=!"
    if not "!ylper!"=="!reply!" (
      echo !line! =ERROR= !reply!
      set /A "errs+=1"
      set /A "errsftp+=1"
    )
goto :eof