2

クライアントが実行中のすべてのプロセスをダイアログ ボックスに一覧表示できるアプリケーションを作成しています。現在、以下のコードがありますが、なぜ機能しないのかわかりません。

sderr であろうと stdout であろうと、出力がまったく表示されません。誰かが私を正しい方向に向けることができますか?

どうもありがとう

private void button1_Click(object sender, EventArgs e)
    {

        string test = " ";

        var ss = new SecureString();
        ss.AppendChar('T');
        ss.AppendChar('a');
        ss.AppendChar('k');
        ss.AppendChar('e');
        ss.AppendChar('c');
        ss.AppendChar('a');
        ss.AppendChar('r');
        ss.AppendChar('e');
        ss.AppendChar('9');
        ss.AppendChar('9');
        ss.MakeReadOnly();

        var serverName = "SERVER-NAME";
        var sessionID = "2";
        var PID = "6816";

        ProcessStartInfo startInfo = new ProcessStartInfo("cmd", "/C tasklist /S " + serverName + " /FI \"SESSION eq " + sessionID + "\" >C:\\users\\test.account\\desktop\\NEWEWE.txt")
        {
            WorkingDirectory = @"C:\windows\system32",
            Verb = "runas",
            Domain = "BARDOM1",
            UserName = "XATest",
            Password = ss,

            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        };

        Process proc = Process.Start(startInfo);
        proc.OutputDataReceived += (x, y) => test += (y.Data);
        proc.BeginOutputReadLine();
        proc.WaitForExit();

        MessageBox.Show(test);
        MessageBox.Show("done");

true と false に設定されたリダイレクト出力を試しました。CMD コマンドでさまざまなプロパティを使用して >c:... を設定しようとしましたが、出力がまったく表示されません。

これについての助けは大歓迎です!どうもありがとう

4

1 に答える 1

1

問題は、コマンド ラインで、出力をファイルに出力するように指定していることです。StringBuilder出力を収集するために a を使用することもお勧めします。で文字列を連結するよりもはるかに効率的です+=

これは、動作中のバージョンを示す例であり、その後に、あなたが見た動作を示すバージョンが続きます.

StringBuilder test = new StringBuilder();

// Not redirected
ProcessStartInfo psi = new ProcessStartInfo("cmd", "/c echo yes")
{
    UseShellExecute = false,
    RedirectStandardOutput = true,
    CreateNoWindow = true
};

Process proc = Process.Start(psi);
proc.OutputDataReceived += (x, y) => test.Append(y.Data);
proc.BeginOutputReadLine();
proc.WaitForExit();

Console.WriteLine(test.ToString()); // Output: yes

test.Clear();

// Redirected
psi = new ProcessStartInfo("cmd", "/c echo yes > NUL")
{
    UseShellExecute = false,
    RedirectStandardOutput = true,
    CreateNoWindow = true
};

proc = Process.Start(psi);
proc.OutputDataReceived += (x, y) => test.Append(y.Data);
proc.BeginOutputReadLine();
proc.WaitForExit();

Console.WriteLine(test.ToString()); // Blank line
于 2015-11-04T14:41:15.103 に答える