在C#中执行批处理文件

我正在尝试在C#中执行批处理文件,但这样做并没有任何运气。

我已经在互联网上找到了许多这样做的例子,但是它对我来说不起作用。

public void ExecuteCommand(string command)

{

int ExitCode;

ProcessStartInfo ProcessInfo;

Process Process;

ProcessInfo = new ProcessStartInfo("cmd.exe", "/c " + command);

ProcessInfo.CreateNoWindow = true;

ProcessInfo.UseShellExecute = false;

Process = Process.Start(ProcessInfo);

Process.WaitForExit();

ExitCode = Process.ExitCode;

Process.Close();

MessageBox.Show("ExitCode: " + ExitCode.ToString(), "ExecuteCommand");

}

命令字符串包含批处理文件的名称(存储在中system32)和它应处理的一些文件。(例如:)txtmanipulator file1.txt

file2.txt file3.txt。当我手动执行批处理文件时,它可以正常工作。

执行代码时,它给了我一个 **ExitCode: 1** (Catch all for general errors)

我究竟做错了什么?

回答:

这应该工作。您可以尝试转储输出和错误流的内容,以便找出正在发生的情况:

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目录中仍然是不好的做法。

它原来的是,如果流被同步读取,可发生死锁,无论是由读取前同步WaitForExit或通过读取两个stderrstdout同步一前一后。

如果改为使用异步读取方法,则不应发生这种情况,如以下示例所示:

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();

}

以上是 在C#中执行批处理文件 的全部内容, 来源链接: utcz.com/qa/423200.html

回到顶部