Ini seharusnya bekerja. Anda bisa mencoba membuang konten dari output dan stream kesalahan untuk mengetahui apa yang terjadi:
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");
}
* EDIT *
Dengan informasi tambahan dalam komentar Anda di bawah, saya dapat membuat ulang masalahnya. Tampaknya ada beberapa pengaturan keamanan yang menghasilkan perilaku ini (belum menyelidiki secara rinci).
Ini tidak bekerja jika file batch tidak terletak di C:\Windows\System32
. Coba pindahkan ke lokasi lain, mis. Lokasi Anda yang bisa dieksekusi. Perhatikan bahwa menyimpan file batch kustom atau file yang dapat dieksekusi di direktori Windows adalah praktik yang buruk.
* EDIT 2 *
Ini Ternyata bahwa jika aliran dibaca serentak, kebuntuan dapat terjadi, baik dengan membaca serentak sebelum WaitForExit
atau dengan membaca baik stderr
dan stdout
sinkron satu demi satu.
Ini seharusnya tidak terjadi jika menggunakan metode baca asinkron sebagai gantinya, seperti dalam contoh berikut:
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
itu. Jika itu berisi jalur dengan spasi, Anda harus memberi tanda kutip di sekitarnya.