1

次の vb.net コードを使用して、外部コマンド ライン アプリケーションを実行し、その出力を読み戻しています。

Public Shared Function Execute(ByVal command As String, ByVal params As String, ByVal workingdir As String) As String
    psi = New ProcessStartInfo(command)
    psi.WorkingDirectory = workingdir
    psi.RedirectStandardOutput = True
    psi.WindowStyle = ProcessWindowStyle.Hidden
    psi.UseShellExecute = False
    psi.CreateNoWindow = True
    psi.Arguments = params
    proc = Process.Start(psi)
    Dim myOutput = proc.StandardOutput
    proc.WaitForExit() 'Problem is here!!!!!!
    Dim ret = myOutput.ReadToEnd
    Return ret
End Function

このコードは、いくつかのアプリケーションで完全に機能しています...今まで. 問題はこれです:私は今それを使って「aapt.exe」(Android APKアプリケーションに関する情報を提供するツール)を多数のファイルで実行していますが、コメントしたポイントでコードが動かなくなります(決して返されません)ただし、合計 81 のファイルのうち 3 つの特定のファイルのみ

もちろん、私が最初に考えたのは、外部プログラムがこれらの特定のファイルで失敗したり動かなくなったりするということでしたが、同じコマンドをコマンド プロンプトから手動でテストしたところ、完全に機能しました。さらに、次のようにコードにタイムアウトを追加しました。

    proc.WaitForExit(10000)

この場合、プロセスは (明らかに) 戻りますが、興味深いのは、出力が正しく完全であることです。これは、外部プログラムが最後まで正しく実行されていることを意味します。これをデバッグする実行可能な方法はありますか?

ありがとう

編集:何時間ものテストの後、問題は「RedirectStandardOutput」オプションにあるという結論に達しました。実行/読み取りの順序に関係なく、一部の実行でハングします。私はこれに対する適切な解決策を見つけられませんでした.stdoutリダイレクトを無効にし、代わりにstdoutをファイルに出力する(恐ろしい)回避策を実装し、プロセスが終了したらすぐにコードで再読み込みします(正しく終了します)少なくともこの方法で)。エレガントな解決策ではありませんが、私はまだこれの根底に行きたいと思っています.

4

2 に答える 2

0

終了後に戻るように /C パラメータを最後に追加しようとしましたか。例 cmd /C " "abc.exe" "

ここで「/C」が重要です。これは、完了後にコマンドプロンプトを終了するように指示します。

于 2014-04-30T06:51:51.807 に答える