0

我在 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 开关或切换详细。

4

2 回答 2

1

调度程序的路径是否包含 和 的FTP目录FIND

您可以将输出保存FTP到一个临时文件中,并将其FIND用于测试目的吗?这样你就可以FTP在事后检查 's 的输出,看看可能发生了什么。

如何省略重定向(或将输出定向到错误日志文件),以便您可以查看批处理文件的输出以查找可能的错误消息?

于 2012-03-30T17:31:08.227 回答
0

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

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 包含任何信息。但是,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 包含一个“开始于(文件夹)”选项 - 您是否尝试将其设置为批处理文件目录?此外,您正在为其运行计划作业的用户帐户可能应该被授予对批处理使用的所有文件和文件夹的显式(非继承)权限。如果批处理始终从命令行运行但在调度程序上失败,则权限问题可能不仅仅是将调度程序用户帐户添加到管理员组。
  2. 您的服务器 ftp 日志显示什么?我的 ftp 服务器是 vsftpd (Linux),我的服务器日志基本上模仿了重定向捕获的 STDOUT 流(带有一些附加信息)。这可能会告诉您传输成功代码是否正在从您的 ftp 服务器传输。
  3. 可能不是原因,但考虑使用 FIND 的 /I 开关使其不区分大小写
  4. 您是否尝试过弄乱重定向命令?类似于:ftp ... 2>&1 | 寻找 ...
于 2012-05-09T17:23:50.703 回答