1

我有下面的代码,我使用 DevCon.exe 捕获某些内容并将其写入文件中。我根据需要解析这个文件。

Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/C devcon.exe find = port *monitor* >> monitor_Details.txt";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.Verb = "runas";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.Start();
p.WaitForExit();

StreamReader sr = p.StandardOutput;
string log = sr.ReadToEnd();
StreamWriter sw = p.StandardInput;
sw.WriteLine("hi.txt");
p.Close();

在这里,我看到 txt 文件一直是空白的。文本文件中没有写入任何内容。有什么问题吗?我还检查了分配给的变量日志

sr.ReadToEnd()

即使这样,日志也总是空白。

请帮助为什么 shell 命令没有被执行:

4

2 回答 2

2
port *monitor* >> monitor_Details.txt

Process 对象中的 CMD shell 输出重定向与在控制台 shell 中的工作方式不同。和在流程上下文">>""|"不起作用。

您将需要devcon.exe直接在 Process 对象中运行,而不是在 CMD.EXE 下包装。然后从 Process 对象的缓冲区捕获您的输出,如果需要日志,将其保存到 txt 文件中。find = port *monitor*只需像您在示例中所做的那样将必要的参数传递为“ ”。

MSDN 有关于输出缓冲区捕获的详细示例和最佳实践。在这里阅读这里。

于 2012-09-18T05:31:57.760 回答
1

我有一个类似的程序,但将输出重定向到我的应用程序的面板。

我要补充

            P.EnableRaisingEvents = true;
            P.OutputDataReceived += proc_OutputDataReceived;
            P.ErrorDataReceived  += proc_ErrorDataReceived;

            P.Start();

            P.BeginOutputReadLine();
            P.BeginErrorReadLine();

这意味着您从缓冲区读取数据,并可以选择将其重定向到文件

    void proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        //e.Data contains the console output. You can redirect it where ever you like
    }

希望能帮助到你

于 2012-09-18T05:24:09.663 回答