4

PsExecを使用して.NETコマンドラインツールをリモートで実行しようとすると、奇妙な問題が発生します。

  1. コマンドラインからPsExecを実行すると、正常に実行されて完了します。

  2. コンソールアプリケーションから実行する場合(プロセスを作成し、必要な引数を指定してPsExec.exeを実行する場合)、正常に実行されます。

  3. さまざまなタスクを実行するために使用される社内のカスタムツールから実行すると、タイムアウトするか、正常に完了しません。

これが私が使用しているコードです:

Process p = new Process();

p.StartInfo.FileName = @"C:\PsExec.exe";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;

string arg = "-snapshot -display C:\*.msi -s";

p.StartInfo.Arguments = @"\\10.161.203.106 -u user -p pwd -cf C:\FVT.exe " + arg;

Logger.Info(this, "Starting process");

p.Start();
var ended = p.WaitForExit(60 * 1000);

if (!ended)
{
    throw new Exception("Process timed out.");
}

Logger.Info(this, "Process ended");

using (StreamReader sr = p.StandardOutput)
{
    string buffer = sr.ReadToEnd();
    Logger.Info(this, buffer);
}

このコードは、cmd行から、またはスタンドアロンアプリから正常に実行されます。

ここで他に何が間違っているのかわかりません。

社内ツールは新しいスレッドを生成し、その中でこのコードを実行します。

アップデート:

コマンドライン+コマンドラインウィンドウの引数-動作中。同じcmd+args、RedirectOutputを使用したプロセスとして実行-ストールしてタイムアウト時に戻ります。

これは.NETのバグでしょうか?(これは他のプログラム、バッチファイルなどで発生します)。

4

2 に答える 2

4

psexecの引数に-accepteulaを追加してみてください

于 2012-09-27T09:18:04.783 に答える
2

エラーが何であるかはわかりませんが、stderr(RedirectStandardError = true)をリダイレクトしてstderrストリームを読み取ると(stdoutの場合と同様に)、エラーが表示されるという予感があります。または、デバッグ中にLeaveを実行するCreateNoWindow = falseと、コンソールメッセージが表示される場合があります(特に、キーが押されるのを待っている場合。そうでない場合は、すぐに消えて気付かない可能性があります)。

プロセスが終了しない場合は、stdout/stderrに非同期リーダーを設定する必要がある場合があることに注意してください。これは、追加のスレッドで、またはOutputDataReceived/イベントを介して行うことができます(これも設定するErrorDataReceived必要があります)。EnableRaisingEventstrue


それでも機能しない場合は、で実行してみることができますUseShellExecute=true。これは、IOをリダイレクトできないことを意味するため、>/ >>etcを使用して出力をファイルにパイプし(理想的には一時的に)、ファイルを読み取る必要がある場合があります。

于 2011-07-25T07:03:21.770 に答える