質問

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

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

  2. コンソールアプリケーションから実行するとき(プロセスを作成し、必要な引数を使用してpsexec.exeを実行します) - それは実行されています。

  3. さまざまなタスクを実行するために使用されるHouse In Houseカスタムツールから実行すると、時間が外れるか、正常に完了しません。

私が使用しているコードは次のとおりです。

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 のバグでしょうか?(これは他のプログラム、バッチ ファイルなどでも発生します)。

役に立ちましたか?

解決

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

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


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

他のヒント

-accepteulaをあなたの議論にpsexecに追加してみてください

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top