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

时间:2012-10-22 10:56:24

标签: windows batch-file vbscript ftp

我正在使用VBS

  1. 将文件上传到FTP
  2. 验证上传过程
  3. 我正在使用创建文本文件的方法,使用适当的命令填充它,然后在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. 为什么不回来。从哪里开始调试?
    2. 无论如何,我可以上传文件并检查其状态(也许是通过 “put”命令后ftp命令返回的错误代码。
    3. 是否在要上载的代码中指定了错误的目录 文件,cd命令失败,它错误地“放”文件 根文件夹。检查文件上传的代码也是如此。所以 即使指定的目录错误,程序也将其返回为 成功
    4. 编辑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对象   提供对这些流的同步读取操作。同步   读操作引入了调用脚本之间的依赖关系   阅读这些流和儿童过程写给那些   流,可能导致死锁条件。

1 个答案:

答案 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