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

それでも、ログは常に空白です。

Plは、シェルコマンドが実行されない理由を示しています。

4

2 に答える 2

2
port *monitor* >> monitor_Details.txt

プロセスオブジェクト内のCMDシェル出力リダイレクトは、コンソールシェルでの動作とは異なります。およびは、プロセスコンテキスト内では機能しません">>""|"

devcon.exeCMD.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 に答える