Batch file FTP服务器响应有时在批处理中未被检测到
我正在Win2003中运行批处理文件,以便通过FTP传输文件 批处理文件通过管道将FTP会话结果传递到查找中,以查看是否有226条成功消息,这很好。不幸的是,从一个调度器中,我遇到了errorlevel条件,即使文件传输成功并且返回了226消息Batch file FTP服务器响应有时在批处理中未被检测到,batch-file,ftp,piping,errorlevel,Batch File,Ftp,Piping,Errorlevel,我正在Win2003中运行批处理文件,以便通过FTP传输文件 批处理文件通过管道将FTP会话结果传递到查找中,以查看是否有226条成功消息,这很好。不幸的是,从一个调度器中,我遇到了errorlevel条件,即使文件传输成功并且返回了226消息 FTP -s:go.ftp 2>NUL | Find "226 Transfer OK" > NUL If ErrorLevel 1 Echo ERROR - FTP transfer failed. >> err.log 用户
FTP -s:go.ftp 2>NUL | Find "226 Transfer OK" > NUL
If ErrorLevel 1 Echo ERROR - FTP transfer failed. >> err.log
用户帐户是管理员帐户,因此不是权限问题。有什么想法吗
更新:
226消息未通过重定向捕获,因此查找失败。在我的测试中,当从调度程序运行时,我将FTP输出重定向到一个单独的文件。尽管FTP命令正在成功运行,但没有出现任何服务器响应
这是我的FTP脚本:
open ftpsite
username
password
dir
quit
以下是输出(FTP-s:go.FTP>FTP.log 2>FTP.err
)
用户(ftpsite:(无)):打开ftpsite
04-01-12 02:35下午1点
04-01-12 02:35下午2点
04-01-12 02:35下午3点
04-01-12 02:35下午4点
迪尔
退出
此外,错误流中不会显示任何内容(2>ftp.err)。至少我现在知道为什么我的FIND的errorlevel没有被触发,但是为什么FTP服务器的响应没有被捕获?我没有使用-v开关或切换verbose。调度程序的路径是否包括
FTP
和FIND
目录
您能否将FTP
的输出保存到一个临时文件中,并将其传输到FIND
以进行测试?这样,您可以在事后检查FTP
的输出,以查看可能发生的情况
省略重定向(或将输出定向到错误日志文件)如何,这样您就可以查看批处理文件的输出,以查找可能的错误消息?我在一系列成功传输中发现了一个丢失的226代码。正在从vbscript调用我的ftp命令,但在其他方面与您的类似:
ftp -i -n -s:"\path\to\cmdfile.txt" [ftpserver] > "\path\to\stdout.log" 2> "\path\to\stderr.log"
由于-n开关和匿名登录,我的命令文件略有不同:
USER anonymous
cd [UploadDirectory]
binary
put [file]
quit
正如您所注意到的,STDERR流似乎总是空的——即使连接不成功。在我所有的测试中,我从未见过STDERR包含任何信息。但是,标准输出包含事务的完整日志:
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.
我正在解析STDOUT文件,99%的时间匹配是在“226传输完成”上进行的,而不是像您的示例中那样通过管道传递命令进行查找;1%的时间我只看到
150 Ok to send data
quit
在226丢失的情况下,文件被成功传输(??),并且看起来完好无损。所有这些都表明,虽然没有管道输出那样优雅,但解析STDOUT文件应该会得到所需的结果
我能想到的其他几点:
是的,批处理文件从调度程序成功运行。我还通过管道将所有输出传输到日志文件,调度程序运行和命令行运行的结果都是相同的。路径是正常的,否则调度程序的运行将爆炸,文件将不在那里。我在处理FTP结果时遇到了与查找日志相同的问题。因此,听起来您是说
FIND
根据是以交互方式运行还是通过调度程序运行设置了不同的错误级别(退出代码)。这是否准确地总结了问题?似乎就是这样,尽管“交互”不是正确的词,因为我没有在命令提示下输入FIND。相反,我正在执行包含FIND命令的批处理文件。我需要澄清我之前的一条评论。经过进一步测试,当我将FTP输出重定向到日志文件时,它实际上缺少服务器响应,但会列出FTP命令本身的结果。例如,DIR命令列出文件内容,但没有226响应。我将用FTP的输出更新主要问题。如何使用-d
启用调试?您可能需要以其他方式解析ftp.log
,以确定它是否成功,-d不会生成服务器响应。这就像调度器为shell创建了另一个现实,它无法获取所有内容。FTP传输在我的情况下是有效的。这更像是调度器创建了一个shell环境,其中STDOUT不可用。正如您所指出的,最初我确实将结果通过管道传递到FIND命令,但在上面的更新中,我还重定向到一个文件。如您所见,FTP命令执行成功,但相关的服务器生成的结果代码不知何故丢失了。
150 Ok to send data
quit