Windows FTP:将文件上载到FTP并验证
我正在使用VBS来Windows FTP:将文件上载到FTP并验证,windows,batch-file,vbscript,ftp,Windows,Batch File,Vbscript,Ftp,我正在使用VBS来 .WriteLine "cd /Test" 将文件上载到FTP 验证上载过程 我使用的方法是创建一个文本文件,用适当的命令填充它,然后在windows中使用ftp.exe执行它 FTPCommand = "%systemroot%\System32\ftp.exe -s:session.txt" FTPCommand = objshell.ExpandEnvironmentStrings(FTPCommand)
.WriteLine "cd /Test"
FTPCommand = "%systemroot%\System32\ftp.exe -s:session.txt"
FTPCommand = objshell.ExpandEnvironmentStrings(FTPCommand)
objshell.Run FTPCommand,, vbTrue
fso.DeleteFile "session.txt", vbTrue
.WriteLine "cd /Test"
第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
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
.WriteLine "cd /Test"
第2部分使用以下代码完成:
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
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
.WriteLine "cd /Test"
从不返回。因此,文件被上载,但检查状态的代码从未返回。session.txt文件在我执行命令时不会被删除
%systemroot%\System32\ftp.exe -s:session.txt
.WriteLine "cd /Test"
手动显示文件列表(因为ls命令)
.WriteLine "cd /Test"
我有3个问题:
.WriteLine "cd /Test"
.WriteLine "cd /Test"
它成功了。是目录切换(两个文件夹深)导致了问题吗
.WriteLine "cd /Test"
编辑2:
我手动运行ls命令,它运行得很好。输出为:
.WriteLine "cd /Test"
226 Transfer complete.
ftp: 586493 bytes received in 4.28Seconds 137.00Kbytes/sec.
586493字节是否太多
.WriteLine "cd /Test"
我认为问题可能是:1) LS命令返回的大量文件。
2) 我正在访问的目录结构
.WriteLine "cd /Test"
编辑:3
从本网站上看,上述第1点似乎是罪魁祸首:
.WriteLine "cd /Test"
控制台应用程序的StdOut和StdErr流共享相同的数据
内部4KB缓冲区。此外,仅WSHScript exec对象
在这些流上提供同步读取操作。同步的
读取操作在调用脚本之间引入依赖关系
从这些流读取数据,子进程向这些流写入数据
流,这可能导致死锁情况
.WriteLine "cd /Test"
我相信问题在于你从过程中读取标准的方式。我成功地使用了这项技术,如下所示:对不起,我没有时间修改您的脚本并试用,所以这取决于您
.WriteLine "cd /Test"
下面执行ping以检查服务器是否联机
.WriteLine "cd /Test"
Function IsOnline(Address)
Dim strText
IsOnline = False
Set oExecObj = oShell.Exec("%comspec% /c ping -a -n 1 -w 20 " & Address)
Do While Not oExecObj.StdOut.AtEndOfStream
strText = oExecObj.StdOut.ReadAll()
If Instr(strText, "Reply from") > 0 Then
IsOnline = True
Exit Function
End If
Loop
End Function
手动调用
FTP.EXE
并键入命令可能更容易调试。从ftp.site.com
开始,它会询问您的用户名和密码,然后您只需按照那里的脚本操作即可。我知道验证文件是否正确上载的唯一方法是下载该文件,并将其与原始文件进行比较。为了确保正确传输,您可以设置ASCII或二进制开关,具体取决于它是文本文件还是二进制文件。这样做很简单,只需在传输文件之前发送文本ascii
或二进制文件即可。如果不这样做,可能会导致意外的问题,因为ftp
处理传输的方式不同。正如我所说,如果我手动运行命令,它运行得非常好(4.28秒内接收到586493字节)。问题是VBS不知何故没有返回结果。我不知道从何处开始调试。执行是否曾经通过DO WHILE ObjExec.status=0:wscript.sleep 50:LOOP
行?不,DO WHILE ObjExec.status=0:wscript.sleep 50:LOOP行永远不会完成执行。我想,ObjExec.status永远不会变为零。即使你收到“回复”,也不意味着主机已启动:有时你会收到路由器的回复,通知你远程网络无法访问Hi-ftiela,这不是重点,如果你想知道pc是否在线,有更好的解决方案,我只是用它来说明stdout的用法,并避免其他评论。不,这不是使用它的方式,但它是可靠和有效的。是的,我知道这不是重点,但在某些情况下,检查是否有“回复来源”并不意味着主机启动:回复来源可能来自路由器或您的主机(例如,我认为最好检查回复的状态,而不仅仅是“reply from”字符串。如果有人使用这种技术,你可能是对的,我需要检查电脑是否启动的大多数时间面临的问题是,我需要在几分钟内检查数百台电脑。尚未找到解决该问题的方法