问题描述:

I am using VBS to

  1. Upload a file to FTP
  2. Verify the upload process

I am using the method which creates a text file, fills it with the appropriate command and then execute it using ftp.exe in windows.

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

FTPCommand = objshell.ExpandEnvironmentStrings(FTPCommand)

objshell.Run FTPCommand,, vbTrue

fso.DeleteFile "session.txt", vbTrue

Part 1 is done using this code:

 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

And Part 2 is done using this code:

 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

The problem is that (in part 2 code) the code after

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

never returns.So the file gets uploaded but the code to check the status never returns.

The session.txt file does not get delete and when I execute the command

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

manually it indeed shows me the list of files (because of ls command).

I have 3 questions:

  1. Why it does not return. Where to start debugging from?
  2. Is there anyway I can upload the file and check its status(maybe by

    the error code returned by the ftp command after the "put" command).

  3. Is there is an incorrect directory specified in the code to upload

    file, the cd command fails and it incorrectly "puts" the file in the

    root folder. same goes for the code checking the file upload. So

    even if the directory specified in wrong, the program returns it as

    successful

Edit 1:

I tried it using

.WriteLine "cd /Test"

and it worked. Is that directory switching (two folders deep)causing the problem ?

Edit 2:

I ran the ls command manually and it ran fine. The output is:

226 Transfer complete.

ftp: 586493 bytes received in 4.28Seconds 137.00Kbytes/sec.

Is 586493 bytes too much for this ?

I believe the problem may be:

1)The large no of files returned by LS command.

2)The directory structure I am accessing.

Edit:3

From this microsoft website it looks like the above point 1 is the culprit:

A console application's StdOut and StdErr streams share the same

internal 4KB buffer. In addition, the WshScriptExec object only

provides synchronous read operations on these streams. Synchronous

read operations introduce a dependency between the calling script

reading from these streams and the child process writing to those

streams, which can result in deadlock conditions.

网友答案:

I believe the problem is the way you read the stdout from the process. I use this technique succesfully as follows, sorry, I have no time to adapt your script and try it out, so that is up to you.

The following executes a ping to check if the server is online.

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       
相关阅读:
Top