我正在使用VBS
我正在使用创建文本文件的方法,使用适当的命令填充它,然后在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个问题:
编辑1: 我尝试使用
.WriteLine "cd /Test"
它有效。该目录是否切换(两个文件夹深)导致问题?
编辑2: 我手动运行ls命令,运行正常。输出是:
226 Transfer complete.
ftp: 586493 bytes received in 4.28Seconds 137.00Kbytes/sec.
586493字节太多了吗?
我认为问题可能是:
1)LS命令返回的大量文件
2)我正在访问的目录结构。
修改:3 从这个microsoft网站看,上面的第1点是罪魁祸首:
控制台应用程序的StdOut和StdErr流共享相同的内容 内部4KB缓冲区。另外,仅限WshScriptExec对象 提供对这些流的同步读取操作。同步 读操作引入了调用脚本之间的依赖关系 阅读这些流和儿童过程写给那些 流,可能导致死锁条件。
答案 0 :(得分:0)
我认为问题在于您从流程中读取stdout的方式。我成功地使用了这种技术,抱歉,我没时间调整你的脚本并尝试一下,所以这取决于你。
以下命令执行ping以检查服务器是否在线。
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