이 작동합니다. 무슨 일이 일어나고 있는지 확인하기 위해 출력 및 오류 스트림의 내용을 덤프 할 수 있습니다.
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 디렉토리에 사용자 정의 배치 파일 또는 실행 파일을 유지하는 것은 좋지 않습니다.
* 2 EDIT
그것은 밝혀 전에 동기식 판독하여 하나의 스트림을 동 기적으로 판독되는 경우에 교착 상태를 초래할 수 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
. 공백이있는 경로가 포함 된 경우 주위에 따옴표를 넣어야합니다.