首页 文章

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

提问于
浏览
1

我正在使用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 回答

  • 1

    使用 find

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

    使用 for /F 命令解析 ftp 通信 . 下一个脚本中的可能方法 . 警告:据说在给定的测试序列中不存在一些 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
    

相关问题