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 WaitForExit
veya her ikisi okuyarak stderr
ve stdout
birbiri 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();
}
command
olduğunu göstermiyorsun. Boşluk içeren yollar içeriyorsa, etrafına tırnak işareti koymanız gerekir.