यह काम करना चाहिए। आप आउटपुट और त्रुटि धाराओं की सामग्री को डंप करने की कोशिश कर सकते हैं ताकि पता चल सके कि क्या हो रहा है:
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 *
यह पता चला है कि अगर धाराओं को तुल्यकालिक रूप से पढ़ा जाता है, तो एक गतिरोध हो सकता है, या तो पहले 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
है। यदि इसमें रिक्त स्थान वाले रास्ते हैं, तो आपको उनके आसपास उद्धरण देने की आवश्यकता होगी।