如何使用 bat 文件检查 ftp 脚本的结果?

如何使用 bat 文件检查 ftp 脚本的结果?

我有一个 .bat 文件,它运行 ftp 脚本,从服务器抓取文件并将其复制到我的机器上。效果很好。

我现在想要这个.bat 文件报告是否发生任何这些错误。

如果您能为我指明正确的方向,告诉我如何做到这一点,那就太好了。

谢谢。

答案1

说实话,我使用固定 FTP 脚本从未取得过很大的成功。即使你处理返回代码,也很难确切知道出了什么问题。

我建议改用 PowerShell 或 Python 来完成这项工作。这两者都可以访问可以动态控制的 FTP 客户端。您将确切地知道哪些操作有效或失败,并能够立即解决问题。

PS 中的简单示例

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

如果你需要做更复杂的事情,我建议你先看看http://msdn.microsoft.com/en-us/library/ms229718.aspx 这些示例是用 C# 编写的,但将它们转换为 PS 应该非常容易。

以此方式构建的脚本可以列出目录并循环下载所需的文件。如果出现任何错误,您可以按照自己喜欢的方式在每个文件级别进行处理。

答案2

以下是在 BAT 文件中执行此操作的方法。

调用 FTP,同时将输出和错误重定向到单独的文件。如果错误文件不为空,则存在问题。

假设您已经创建了名为和的set变量,那么以下内容应该有效:FTPFILEOUTPUTFILEERRORFILE

  1. 调用 FTP,捕获输出和错误到单独的文件中。

    ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%"
    
  2. 检查 FTP 调用是否失败

    if  ERRORLEVEL 1 (
        echo Call to ftp returned an error. See file: %OUTPUTFILE%
        exit /b 1
    )
    
  3. 检查 FTP 会话是否包含错误。通过检查错误文件的大小来执行此操作。

    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
    )
    

答案3

尽管谢兹上述示例是捕获大多数基于 DOS 的程序的错误的一种很好的标准方法,这些程序设置了 ERRORLEVEL 并从标准错误 (2>) 产生输出,而 MS 的 ftp.exe 开箱即用,不会设置 ERRORLEVEL。无论脚本 (-s: 参数) 成功还是失败,ERRORLEVEL 都保持为零。将标准错误 (2>) 重定向到“%ERRORFILE%”也不起作用,因为此文件将始终是零字节文件(因为 ftp.exe 始终返回 ERROR_SUCCESS 或 0),因此只会创建一个空文件。因此命令字符串:

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

永远不会产生预期的结果。如果我们被迫使用 Microsoft FTP 客户端,最好的办法是解析 %OUTPUTFILE% 中的某些文本字符串,以指示错误,或者使用不同于 MS 的 FTP 客户端(如 IPSWITCH WS_FTP),以便更好地捕获错误。一旦我以暴力方式完成编码,我将在几个小时内跟进如何解析 %OUTPUTFILE% 的代码示例。谢谢!

跟进

请参阅下面的第二篇帖子,了解交互式 Microsoft FTP 会话的示例。接下来是解析示例...好的,接下来是马丁·S在 stackoverflow.com 上发帖这里。我的解决方案使用 FINDSTR 和一个包含搜索条件的单独文本文件:

创建一个包含以下文本字符串的文本文件 (FTP_ERR_SEARCH_CRITERIA.txt):

not connected
not found
failed

从批处理/命令文件中调用以下子例程:

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

电话:

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

Microsoft FTP 输出示例

继续我之前说的……有时候,了解某件事物如何运作的最好方法是亲自测试,而不是依赖互联网上大量的错误信息。下面就是例子。下面的示例显示了两个不同的文件:文本文件tst.tx(名称上有细微的差别,但本质上是不同的)。tst。TXTtst 文件存在。德克萨斯州才不是。

Microsoft FTP 示例(为清晰起见添加了空格):

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.

注意本地文件系统和远程文件系统如何响应上述命令:

为了第一尖沙咀TXT命令(该文件存在于本地文件系统上)我们看到远程服务器通过传输文件做出响应。

第二次尖沙咀德克萨斯州命令(文件 tst.tx 在两个系统上都不存在),我们看到本地文件系统以文件名响应tst.tx以及错误信息文件未找到

第三次得到尖沙咀德克萨斯州命令(文件 tst.tx 再次不存在),我们看到远程文件系统(实际上是远程 FTP 主机)响应FTP 错误代码 550,文件名tst.tx以及错误信息该系统找不到指定的文件。

第四次也是最后一次得到尖沙咀TXT命令(该文件现在存在于远程系统上)我们看到远程系统响应传输成功。

为什么要解释这么多?当我们解析上一篇文章中的文件以查看 MS ftp.exe 返回的错误消息时,这很重要。

答案4

该错误消息是 FTP 特定错误,这是因为您的防火墙默认禁用 FTP 连接(这是一件好事!)。

您可以忽略此消息,因为它不会以任何方式影响您的计算机。

相关内容