1

私はVBSを使用しています

  1. ファイルを FTP にアップロードする
  2. アップロード プロセスを確認する

テキストファイルを作成し、適切なコマンドを入力してから、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 コマンドは失敗し、ルート フォルダにファイルを誤って「配置」します。ファイルのアップロードをチェックするコードについても同様です。したがって、ディレクトリが間違って指定されていても、プログラムはそれを成功として返します

編集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 オブジェクトは、これらのストリームに対する同期読み取り操作のみを提供します。同期読み取り操作は、これらのストリームから読み取る呼び出しスクリプトと、それらのストリームに書き込む子プロセスとの間に依存関係を導入し、デッドロック状態になる可能性があります。

4

1 に答える 1