将命令运行到CMD并使用C#

时间:2015-12-22 13:33:39

标签: c# cmd

我需要在CMD窗口中运行一个命令,并希望将结果输入变量。 我使用下面的代码做同样的事情,但输出不正确

        var proc = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "cmd.exe",
                Arguments = " wmic.exe /node:(computername or ip address) computersystem get username ",
                UseShellExecute = false,
                RedirectStandardOutput = true,
                CreateNoWindow = true
            }
        };

        proc.Start();
        string line = "";
        while (!proc.StandardOutput.EndOfStream)
        {
            line += (line.Length > 0 ? "-----" : "") + proc.StandardOutput.ReadLine();
        }

        proc.WaitForExit(); 

输出

Microsoft Windows [Version 6.1.7601]-----Copyright (c) 2009 Microsoft Corporation.  All rights reserved.----------C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0>

但是当我在CMD窗口中运行此命令时,它会显示当前登录的用户名。

任何人都可以帮我解决问题。

  

注意: - 给定的命令用于获取当前登录的用户   使用它的IP地址在网络系统上命名。

2 个答案:

答案 0 :(得分:3)

您需要的是cmd的/ c选项

C:\>cmd /?
Starts a new instance of the Windows command interpreter

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/C      Carries out the command specified by string and then terminates

我会在这里质疑cmd.exe的必要性。您可以直接调用wmic,如下所示

var proc = new Process {
    StartInfo = new ProcessStartInfo {
        FileName = "wmic.exe",
        Arguments = "/node:localhost computersystem get username ",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};

proc.Start();
string line = "";
while (!proc.StandardOutput.EndOfStream) {
    line += (line.Length > 0 ? "-----" : "") + proc.StandardOutput.ReadLine();
}

proc.WaitForExit();

答案 1 :(得分:0)

如果System.Management具有获取进程和托管信息所需的所有类,为什么会遇到调用命令行工具并解析其结果的麻烦?

var ip = "127.0.0.1";
var scope = new ManagementScope(
    String.Format("\\\\{0}\\root\\cimv2", ip),
    new ConnectionOptions { Impersonation = ImpersonationLevel.Impersonate });
scope.Connect();

var users = new ManagementObjectSearcher(
    scope,
    new ObjectQuery("Select * from Win32_LoggedonUser"))
        .Get()
        .GetEnumerator();

while(users.MoveNext())
{
        var user =  users.Current["antecedent"];
        var mo = new ManagementObject(new ManagementPath(user.ToString()));

        try
        {
            var username = mo.Properties["name"];
            Console.WriteLine("username {0}", username.Value);
        }
        catch
        {
            Console.WriteLine(mo);
        }
}

您所要做的就是创建一个ManagementScope,然后使用ManagementObjectSearcher之一运行任何WMI Query Language语句来运行任何WMI Classes语句。

如果您有wmic个来电,则可以随时添加/TRACE:ON,以便检查正在进行的通话。使用wmic /?查看别名。