.NET:读取命令提示符输出

时间:2012-02-14 19:05:36

标签: c# command-line netsh

我想从.net调用netsh命令,我正在使用Process类来启动调用netsh命令的进程,并且它正常工作,现在我想要获取.NET中netsh命令返回的输出,例如我在Process中调用以下命令:

netsh wlan show hostednetwork

这将返回活动的managednetwork列表。

如何阅读.NET中的列表?
任何人都可以帮助我或带我走正确的道路(我不想使用任何第三方工具)?


更新 下面是我使用netsh wlan show hostednetwork命令的返回输出

托管网络设置

Mode                   : Allowed
SSID name              : "AqaMaula(TUS)"
Max number of clients  : 100
Authentication         : WPA2-Personal
Cipher                 : CCMP

托管网络状态

Status                 : Started
BSSID                  : 06:65:9d:26:f4:b7
Radio type             : 802.11n
Channel                : 11
Number of clients      : 1
    d0:c1:b1:44:8b:f0        Authenticated

有人能告诉我如何获取所有个人数据并将其放入数据库,如模式,SSID名称等(单独)?

4 个答案:

答案 0 :(得分:4)

在开始此过程之前,您需要将StartInfo.UseShellExecute设置为false并将RedirectStandardOutput设置为true,然后从Process.StandardOutput读取。

所有MSDN上都记录了这些内容:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx

答案 1 :(得分:4)

使用Process类的StandardOutput属性 上面链接的MSDN页面附带了一个如何使用StandardOutput的简单示例。

答案 2 :(得分:4)

以下是代码:

using System;
using System.Diagnostics;

public static class Program
{
    public static void Main()
    {
        var output = RunProcess();
        Console.WriteLine(output);
    }

    /// <summary>
    /// Runs the process: starts it and waits upon its completion.
    /// </summary>
    /// <returns>
    /// Standart output content as a string.
    /// </returns>
    private static string RunProcess()
    {
        using (var process = CreateProcess())
        {
            process.Start();

            // To avoid deadlocks, always read the output stream first and then wait.
            // For details, see: [Process.StandardOutput Property (System.Diagnostics)](https://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput(v=vs.110).aspx).
            var output = process.StandardOutput.ReadToEnd();
            process.WaitForExit();

            return output;
        }
    }

    private static Process CreateProcess()
    {
        return new Process
            {
                StartInfo =
                    {
                        FileName = "netsh",
                        Arguments = "wlan show hostednetwork",
                        UseShellExecute = false,
                        RedirectStandardOutput = true
                    }
            };
    }
}

更新

我认为您应该使用Managed Wifi API框架而不是解析命令行实用程序的结果。这是更可靠的方式。看看来源,它们包含WifiExample

答案 3 :(得分:1)

它应该是这样的:

//@param output The output captured from the netsh command in String format
//@param key The key you are trying to find (in your example "Mode")
public String getValue(String output, String key) {
    MatchCollection matches;
    Regex rx = new Regex(@"(?<key>[A-Za-z0-0 ]+)\t\:\s(?<value>[.]+)");
    matches = rx.Matches(output);

    foreach (Match match in matches) {
        GroupCollection groups = match.Groups;

        if (groups["key"] == key) {
            return groups["value"];
        }
    }
}

不幸的是,我无法测试它来修复任何小错误。

另外,如果您要经常引用它们,我会在解析后将它们放入字典中,以减少查找时间。