我使用VBS到FTP:上傳文件到FTP和驗證
- 將文件上傳到FTP
- 確認上傳過程
我使用它創建一個文本文件的方法,用適當的命令填充它,然後在Windows中使用ftp.exe執行它。
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部分使用此代碼完成:
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 "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
永不退貨。因此t他上傳文件,但檢查狀態的代碼永遠不會返回。
的session.txt文件不會被刪除,當我手動執行命令
%systemroot%\System32\ftp.exe -s:session.txt
它的確顯示我的文件列表(因爲ls命令)。
我有3個問題:
- 爲什麼它沒有返回。從哪裏開始調試?
- 是否有反正我可以上傳文件並檢查其狀態(可能由 「put」命令後由ftp命令返回的錯誤代碼)。
- 是否在代碼中指定了錯誤的目錄以上載 文件,cd命令失敗,並且它不正確地將文件「放入」 根文件夾。檢查文件上傳的代碼也一樣。 我嘗試了用
.WriteLine "cd /Test"
和它的工作:所以 即使錯了指定的目錄中,該程序作爲 成功
編輯1返回。該目錄切換(兩個文件夾深)導致問題?
編輯2: 我手動運行ls命令,它運行良好。輸出是:
226 Transfer complete.
ftp: 586493 bytes received in 4.28Seconds 137.00Kbytes/sec.
是586493字節太多了嗎?
我相信問題可能是:
1)LS命令返回的文件數量很大。
2)我正在訪問的目錄結構。
編輯:3 從這個microsoft網站,它看起來像上述第1點是罪魁禍首:
控制檯應用程序的輸出和錯誤流共享相同的 內部4KB緩衝區。另外,WshScriptExec對象只有 提供對這些流的同步讀取操作。同步 讀操作引入了從這些流讀取的調用腳本 與寫入這些流的子流程之間的依賴關係,這可能會導致死鎖情況。
通過手動調用'FTP.EXE'並輸入命令可能會更容易調試。從'ftp ftp.site.com'開始,它會詢問您的用戶名和密碼,然後您只需按照該腳本進行操作即可。 –
我知道驗證文件是否正確上傳的唯一方法是下載它,並將其與原始文件進行比較。爲確保傳輸正確,您可以設置ASCII或BINARY開關,具體取決於它是文本還是二進制文件。這樣做很簡單,只需在傳輸文件之前發送文本「ascii」或「binary」即可。如果不這樣做可能會導致意外的問題,因爲ftp處理傳輸的方式不同。 –
就像我說的,如果我手動運行命令,它將完全正常運行(在4.28秒內收到586493個字節)。問題在於VBS以某種方式不返回結果。我不知道從哪裏開始調試。 –