FTP服务器响应有时在批处理中未被检测到



我正在Win2003中运行一个批处理文件,以便通过FTP传输文件。

批处理文件将FTP会话结果管道传输到FIND中,以查看是否有226成功消息,这一操作效果良好。不幸的是,从调度程序中,我遇到了错误级别的条件,即使文件传输成功并且返回了226消息。

FTP -s:go.ftp 2>NUL | Find "226 Transfer OK" > NUL
If ErrorLevel 1 Echo ERROR - FTP transfer failed. >> err.log

用户帐户是管理员帐户,所以这不是权限问题。有什么想法吗?

更新:

226消息未通过重定向捕获,因此FIND失败。在测试中,当从调度程序运行时,我将FTP输出重定向到一个单独的文件。尽管FTP命令运行成功,但没有出现任何服务器响应。

这是我的FTP脚本:

open ftpsite
username
password
dir
quit

这是输出(FTP -s:go.ftp >ftp.log 2>ftp.err)。

User (ftpsite:(none)): open ftpsite
04-01-12  02:35PM       <DIR>          DIR1
04-01-12  02:35PM       <DIR>          DIR2
04-01-12  02:35PM       <DIR>          DIR3
04-01-12  02:35PM       <DIR>          DIR4

dir 
quit

此外,错误流中没有显示任何内容(2>ftp.err)。至少我现在知道为什么我的FIND的错误级别没有被触发,但为什么FTP服务器的响应没有被捕获?我没有使用-v开关或切换verbose。

调度程序的路径是否包括FTPFIND目录?

您可以将FTP的输出保存到一个临时文件中,并将其管道传输到FIND以进行测试吗?这样,您就可以在事后检查FTP的输出,看看可能发生了什么。

去掉重定向(或将输出定向到错误日志文件),这样您就可以查看批处理文件的输出以查找可能的错误消息,怎么样?

我在一系列成功的传输中研究了一个丢失的226代码。我的ftp命令是从vbscript调用的,但在其他方面与您的类似:

ftp -i -n -s:"pathtocmdfile.txt" [ftpserver] > "pathtostdout.log" 2> "pathtostderr.log"

由于-n开关和匿名登录,我的命令文件略有不同:

USER anonymous
cd [UploadDirectory]
binary
put [file]
quit

正如您所指出的,STDERR流似乎总是空的,即使连接不成功也是如此。在我所有的测试中,我从未见过STDERR包含任何信息。然而,STDOUT包含事务的完整日志:

220 Unauthorized access to this server is prohibited. All actions are logged.
USER anonymous
230-Anonmyous Access
230 Login successful.
cd [UploadDirectory]
250 Directory successfully changed.
binary
200 Switching to Binary mode.
put "[file]"
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
1058.3090.82quit
221 Goodbye.

我没有像您的例子那样将命令管道传输到FIND,而是分析STDOUT文件,99%的时间都是在"226传输完成"上匹配的;1%的时间我只看到

150 Ok to send data
quit

在226丢失的情况下,文件会被成功传输(??),并且看起来完好无损。所有这些都表明,虽然不像将输出管道传输到FIND那样优雅,但解析STDOUT文件应该会给您所需的结果。

我能想到的其他几个项目:

  1. 大多数调度程序/cron问题都是由路径和权限引起的。MS Scheduler包含一个"Start In(folder)"选项-您是否尝试将其设置为批处理文件目录?此外,运行计划作业的用户帐户可能应该被授予对批处理使用的所有文件和文件夹的显式(而不是继承的)权限。如果批处理始终从命令行运行,但在调度程序上失败,那么权限问题可能不仅仅是将调度程序用户帐户添加到管理组
  2. 你的服务器ftp日志显示什么?我的ftp服务器是vsftpd(Linux),我的服务器日志基本上模仿重定向捕获的STDOUT流(带有一些附加信息)。这可能会告诉你传输成功代码是否是从ftp服务器传输的
  3. 可能不是原因,但请考虑将/I开关与FIND一起使用,使其不区分大小写
  4. 你试过扰乱重定向命令吗?类似于:ftp。。。2> &1|查找

最新更新