Windows FTP:将文件上载到FTP并验证

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)

我正在使用VBS来

.WriteLine "cd /Test"
  • 将文件上载到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
    
    .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"
    
  • 为什么它不回来。从哪里开始调试
  • 我是否可以上传文件并检查其状态(可能通过 ftp命令在“put”命令之后返回的错误代码)
  • 是否在要上载的代码中指定了不正确的目录 文件时,cd命令失败,并将文件错误地“放入”到 根文件夹。检查文件上传的代码也是如此。所以 即使指定的目录不正确,程序也会将其返回为 成功的
  • 编辑1: 我试着用它

    .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”字符串。如果有人使用这种技术,你可能是对的,我需要检查电脑是否启动的大多数时间面临的问题是,我需要在几分钟内检查数百台电脑。尚未找到解决该问题的方法