在C#中运行命令行,无需窗口并获取输出
在C#中运行命令行,无需窗口并获取输出
我正在尝试从C#运行一个命令行脚本。我希望它在没有shell的情况下运行,并将输出放入我的字符串output中。它不喜欢p.StartInfo这一行。我做错了什么?我没有像"How To: Execute command line in C#, get STD OUT results"中那样运行文件,例如p.StartInfo.FileName = "YOURBATCHFILE.bat"。我需要设置"CMD.exe"和命令行字符串。我尝试过p.Start("CMD.exe", strCmdText);,但是它给我一个错误:"成员'System.Diagnostics.Process.Start(string,string)'无法通过实例引用访问;请改用类型名称进行限定。"
string ipAddress; System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; string strCmdText; strCmdText = "tracert -d " + ipAdress; p.StartInfo("CMD.exe", strCmdText); string output = p.StandardOutput.ReadToEnd(); p.WaitForExit();
出现的原因:
出现问题的原因是使用了错误的StartInfo
方法。正确的方法是根据ProcessStartInfo 类和Process.Start 方法 ()的文档进行操作。
解决方法:
正确的代码应该类似于这样:
string ipAddress; System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; string strCmdText; strCmdText = "/C tracert -d " + ipAdress; // Correct way to launch a process with arguments p.StartInfo.FileName="CMD.exe"; p.StartInfo.Arguments=strCmdText; p.Start(); string output = p.StandardOutput.ReadToEnd(); p.WaitForExit();
另外,注意我在strCmdText
中添加了/C
参数。根据cmd /?
帮助,/C
的作用是执行完命令后终止。
是的,我尝试过这样做。但是会出现错误信息 "Member 'System.Diagnostics.Process.Start(string,string)' cannot be accessed with an instance reference; qualify it with a type name instead."(无法通过实例引用访问成员 'System.Diagnostics.Process.Start(string,string)';请改为使用类型名来限定。)
问题的原因是代码中使用了RedirectStandardOutput属性来重定向标准输出流,但在启动进程之前,没有将UseShellExecute属性设置为false。这导致在启动进程时出现了错误。
解决方法是将UseShellExecute属性设置为false,以便可以重定向标准输出流。修改后的代码如下:
const string ipAddress = "127.0.0.1"; Process process = new Process { StartInfo = { UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true, FileName = "cmd.exe", Arguments = "/C tracert -d " + ipAddress } }; process.Start(); process.WaitForExit(); if(process.HasExited) { string output = process.StandardOutput.ReadToEnd(); }
这样修改后的代码可以在不显示窗口的情况下运行命令行,并获取输出结果。通过重定向标准输出流,我们可以将输出结果保存到output变量中,以便进一步处理。