在C#中运行命令行,无需窗口并获取输出

16 浏览
0 Comments

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

0
0 Comments

出现的原因:

出现问题的原因是使用了错误的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)';请改为使用类型名来限定。)

0
0 Comments

问题的原因是代码中使用了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变量中,以便进一步处理。

0