无法获得CMD输出

时间:2017-01-19 10:52:10

标签: c# cmd process arguments

所以这是我的代码:

private void CheckLastLogon(string computername)
{
    string cmd = $"/C query user /server:{computername}";
    System.Diagnostics.Process proc = new System.Diagnostics.Process();
    proc.StartInfo.FileName = "cmd.exe";
    proc.StartInfo.Arguments = cmd;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.CreateNoWindow = true;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.Start();

    string output = proc.StandardOutput.ReadToEnd();

    proc.WaitForExit();
}

output总是string.Empty,我不知道为什么......(它在CMD工作)。

我的命令中可能是/c的原因?它会终止快速吗?

我的错误在哪里?

更新1: 重定向ErrorOutput后,我得到了一些额外的信息。

我添加了ErrorOutput并且它说了命令'查询'找不到

那么我的命令是什么问题?

在这里,您可以看到它在cmd中工作:

enter image description here

更新2:如果我从命令中删除了/c,它就没有做任何事情。如果我打破调试器,它会在proc.StandardOutput.ReadToEnd();

等待

一段时间后,我得到ContextSwitchDeadlock ...

这有什么可怕的错误?

1 个答案:

答案 0 :(得分:2)

如果您正在寻找错误,请执行以下操作:

proc.StartInfo.RedirectStandardError = true;

然后从proc.StandardError读取。

更新1:

如果使用cmd作为中间人,则无法正常工作。您可以尝试直接将C:\Windows\System32\query.exe作为独立.exe运行。这样可以避免使用cmd以及可能导致的所有问题。

所以你要看的是:

ProcessStartInfo procstart = new ProcessStartInfo
{
           FileName = @"C:\Windows\System32\query.exe",
           Arguments = $"user /server:{computername}",
           UseShellExecute = false,
           CreateNoWindow = true,
           RedirectStandardOutput = true,
           RedirectStandardError = true
};
Process proc = new Process{StartInfo = procStart};
proc.Start();
string[] output = proc.StandardOutput.ReadAllLines();

更新2:

system32只能由x64程序访问,x32程序会被重定向到syswow64

如果您仅针对x64 进行构建,则以下代码有效:

        ProcessStartInfo procstart = new ProcessStartInfo
        {
            FileName = "query",
            Arguments = "$"user /server:{computername}"",
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true
        };
        Process proc = new Process {StartInfo = procstart};
        proc.Start();
        Console.WriteLine(proc.StandardOutput.ReadToEnd());
        Console.WriteLine(proc.StandardError.ReadToEnd());
        Console.Read();

<强> TLDR:

如果您尝试使用cmd命令,请不要使用cmd作为中间人,只需将其放入StartInfo.FileName即可。如果该命令在system32中,请确保为x64构建。