我正在使用 VBS
- 上传文件到 FTP
- 验证上传过程
我正在使用创建文本文件的方法,用适当的命令填充它,然后在 Windows 中使用 ftp.exe 执行它。
FTPCommand = "%systemroot%\System32\ftp.exe -s:session.txt"
FTPCommand = objshell.ExpandEnvironmentStrings(FTPCommand)
objshell.Run FTPCommand,, vbTrue
fso.DeleteFile "session.txt", vbTrue
第 1 部分使用以下代码完成:
Set SessionFile = fso.OpenTextFile("session.txt", 2, vbTrue)
With SessionFile
.WriteLine "open abcd.com"
.WriteLine "username"
.WriteLine "pwd"
.WriteLine "cd /Test/Test1"
.WriteLine "put """ & File.Path & """"
.WriteLine "quit"
.Close
End With
FTPCommand = "%systemroot%\System32\ftp.exe -s:session.txt"
FTPCommand = objshell.ExpandEnvironmentStrings(FTPCommand)
objshell.Run FTPCommand,, vbTrue
fso.DeleteFile "session.txt", vbTrue
第 2 部分是使用以下代码完成的:
Set SessionFile = fso.OpenTextFile("session.txt", 2, vbTrue)
With SessionFile
.WriteLine "open abcd.com"
.WriteLine "username"
.WriteLine "pwd"
.WriteLine "cd /Test/Test1"
.WriteLine "ls"
.WriteLine "close"
.WriteLine "bye"
.Close
End With
FTPCommand = "%systemroot%\System32\ftp.exe -s:session.txt"
FTPCommand = objshell.ExpandEnvironmentStrings(FTPCommand)
set ObjExec=objshell.exec(FTPCommand)
DO WHILE ObjExec.status=0 : wscript.sleep 50 : LOOP
StrTemp=ObjExec.stdout.readall
IF instr(1,StrTemp,File.Name,1)<>0 THEN
AlertMessage = AlertMessage & vbTab & "STATUS: UPLOAD SUCCESSFUL" & vbCrLf & vbCrLf
ELSE
AlertMessage = AlertMessage & vbTab & "STATUS: UPLOAD FAILED" & vbCrLf & vbCrLf
END IF
fso.DeleteFile "session.txt", vbTrue
问题是(在第 2 部分代码中)之后的代码
DO WHILE ObjExec.status=0 : wscript.sleep 50 : LOOP
永远不会返回。因此文件被上传,但检查状态的代码永远不会返回。
session.txt 文件没有被删除,当我执行命令时
%systemroot%\System32\ftp.exe -s:session.txt
手动它确实向我显示了文件列表(因为 ls 命令)。
我有3个问题:
- 为什么它不返回。从哪里开始调试?
- 无论如何我可以上传文件并检查它的状态(可能是通过“put”命令之后的 ftp 命令返回的错误代码)。
- 代码中是否指定了不正确的目录来上传文件,cd 命令失败并且它错误地将文件“放入”根文件夹中。检查文件上传的代码也是如此。所以即使指定的目录错误,程序也会返回成功
编辑1: 我尝试使用
.WriteLine "cd /Test"
它奏效了。是目录切换(两个文件夹深)导致问题吗?
编辑 2: 我手动运行 ls 命令,它运行良好。输出是:
226 Transfer complete.
ftp: 586493 bytes received in 4.28Seconds 137.00Kbytes/sec.
586493 字节是否太多了?
我相信问题可能是:
1)LS命令返回的文件数量很大。
2)我正在访问的目录结构。
编辑:3 从这个微软网站看来,上面的第 1 点是罪魁祸首:
控制台应用程序的 StdOut 和 StdErr 流共享相同的内部 4KB 缓冲区。此外,WshScriptExec 对象仅提供对这些流的同步读取操作。同步读取操作在从这些流读取的调用脚本和写入这些流的子进程之间引入了依赖关系,这可能导致死锁情况。