FTP:将文件上传到FTP并验证

问题描述 投票:1回答:1

我正在使用VBS

  1. 上传文件到FTP
  2. 验证上传过程

我正在使用创建文本文件的方法,用适当的命令填充它,然后在Windows中使用ftp.exe执行它。

            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 "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 

问题是(在第2部分代码中)

            DO WHILE ObjExec.status=0 : wscript.sleep 50 : LOOP

永不返回。因此文件被上传,但用于检查状态的代码永不返回。
session.txt文件无法删除,执行命令时也不会删除

%systemroot%\System32\ftp.exe -s:session.txt

手动它确实向我显示了文件列表(由于ls命令)。

我有3个问题:

  1. 为什么它不返回。 从哪里开始调试?
  2. 无论如何,我可以上传文件并检查其状态(也许是在“ put”命令之后ftp命令返回的错误代码)。
  3. 是否在代码中指定了不正确的目录来上载文件,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从此Microsoft网站看来,以上第1点是罪魁祸首:

控制台应用程序的StdOut和StdErr流共享相同的内部4KB缓冲区。 此外,WshScriptExec对象仅在这些流上提供同步读取操作。 同步读取操作在从这些流读取的调用脚本与向这些流写入的子进程之间引入了依赖关系,这可能导致死锁条件。

windows batch-file vbscript ftp
1个回答
0
投票

我相信问题是您从流程中读取标准输出的方式。 我成功地按如下方式使用了该技术,很抱歉,我没有时间调整您的脚本并进行尝试,所以这取决于您。

以下命令执行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       
© www.soinside.com 2019 - 2024. All rights reserved.