私はVBSを使用しています
- ファイルを 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
パート 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 つの質問があります。
- どうせ返ってこない。どこからデバッグを開始しますか?
- とにかく、ファイルをアップロードしてそのステータスを確認できますか(おそらく、「put」コマンドの後にftpコマンドによって返されるエラーコードによって)。
- ファイルをアップロードするコードで指定されたディレクトリが正しくない場合、cd コマンドは失敗し、ルート フォルダにファイルを誤って「配置」します。ファイルのアップロードをチェックするコードについても同様です。したがって、ディレクトリが間違って指定されていても、プログラムはそれを成功として返します
編集1: 使ってみた
.WriteLine "cd /Test"
そしてそれはうまくいきました。そのディレクトリの切り替え(2つのフォルダの深さ)が問題の原因ですか?
編集 2: ls コマンドを手動で実行したところ、正常に実行されました。出力は次のとおりです。
226 Transfer complete.
ftp: 586493 bytes received in 4.28Seconds 137.00Kbytes/sec.
これには 586493 バイトは多すぎますか?
問題は次のとおりだと思います
。1) LS コマンドによって返されるファイルの数が多い。
2)アクセスしているディレクトリ構造。
編集:3 このマイクロソフトのWebサイトから、上記のポイント1が原因のようです:
コンソール アプリケーションの StdOut および StdErr ストリームは、同じ内部 4 KB バッファーを共有します。さらに、WshScriptExec オブジェクトは、これらのストリームに対する同期読み取り操作のみを提供します。同期読み取り操作は、これらのストリームから読み取る呼び出しスクリプトと、それらのストリームに書き込む子プロセスとの間に依存関係を導入し、デッドロック状態になる可能性があります。