Bu çalışmalı. Ne olduğunu bulmak için çıktı ve hata akışlarının içeriğini boşaltmayı deneyebilirsiniz:
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");
}
* DÜZENLE *
Aşağıdaki yorumunuzdaki ek bilgiler göz önüne alındığında, sorunu yeniden oluşturabildim. Bu davranışla sonuçlanan bir güvenlik ayarı var gibi görünüyor (bunu ayrıntılı olarak araştırmadık).
Bu does toplu iş dosyası bulunan değilse işi C:\Windows\System32. Başka bir konuma, örneğin çalıştırılabilir dosyanızın konumuna taşımayı deneyin. Özel toplu iş dosyalarını veya yürütülebilir dosyaları Windows dizininde tutmanın yine de kötü bir uygulama olduğunu unutmayın.
* * DÜZENLEME 2
O çıkıyor önce eşzamanlı okuyarak ya akışları eşzamanlı okunur bile, bir kilitlenme oluşabilir WaitForExitveya her ikisi okuyarak stderrve stdoutbirbiri ardına eşzamanlı biri.
Aşağıdaki örnekte olduğu gibi bunun yerine eşzamansız okuma yöntemleri kullanılıyorsa bu gerçekleşmemelidir:
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();
}
commandolduğunu göstermiyorsun. Boşluk içeren yollar içeriyorsa, etrafına tırnak işareti koymanız gerekir.