Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file FTP服务器响应有时在批处理中未被检测到_Batch File_Ftp_Piping_Errorlevel - Fatal编程技术网

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

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 用户

我正在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
用户帐户是管理员帐户,因此不是权限问题。有什么想法吗

更新:

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文件应该会得到所需的结果

我能想到的其他几点:

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

  • 是的,批处理文件从调度程序成功运行。我还通过管道将所有输出传输到日志文件,调度程序运行和命令行运行的结果都是相同的。路径是正常的,否则调度程序的运行将爆炸,文件将不在那里。我在处理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