これはうまくいくはずです。何が起こっているのかを知るために、出力ストリームとエラーストリームの内容をダンプしてみることができます。
static void ExecuteCommand(string command)
{
int exitCode;
ProcessStartInfo processInfo;
Process process;
processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
// *** Redirect the output ***
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
process = Process.Start(processInfo);
process.WaitForExit();
// *** Read the streams ***
// Warning: This approach can lead to deadlocks, see Edit #2
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
exitCode = process.ExitCode;
Console.WriteLine("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output));
Console.WriteLine("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error));
Console.WriteLine("ExitCode: " + exitCode.ToString(), "ExecuteCommand");
process.Close();
}
static void Main()
{
ExecuteCommand("echo testing");
}
*編集*
以下のコメントの追加情報を考慮して、問題を再現することができました。この動作を引き起こすセキュリティ設定があるようです(詳細には調査していません)。
これは、バッチファイルが次の場所にない場合に機能します。C:\Windows\System32
ます。実行可能ファイルの場所など、他の場所に移動してみてください。いずれにしても、カスタムバッチファイルまたは実行可能ファイルをWindowsディレクトリに保持することはお勧めできません。
* * EDIT 2
それが判明する前に、同期読み取ることによって、いずれか、ストリームが同期読まれている場合、デッドロックが発生する可能性があることWaitForExit
、またはその両方読み取ることによって、stderr
およびstdout
他の後に同期ものを。
これは、次の例のように、非同期の読み取りメソッドを代わりに使用する場合は発生しません。
static void ExecuteCommand(string command)
{
var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
var process = Process.Start(processInfo);
process.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
Console.WriteLine("output>>" + e.Data);
process.BeginOutputReadLine();
process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
Console.WriteLine("error>>" + e.Data);
process.BeginErrorReadLine();
process.WaitForExit();
Console.WriteLine("ExitCode: {0}", process.ExitCode);
process.Close();
}
command
。スペースを含むパスが含まれている場合は、パスを引用符で囲む必要があります。