2

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

netsh wlan show hostednetwork

这将返回给我活动托管网络的列表。

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


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

托管网络设置

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

4 回答 4

4

在开始该过程之前,您需要设置StartInfo.UseShellExecute为 false 和RedirectStandardOutputtrue,然后从Process.StandardOutput.

所有记录在 MSDN 上:http: //msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx

于 2012-02-14T19:07:40.943 回答
4

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

于 2012-02-14T19:08:29.270 回答
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
                    }
            };
    }
}

更新

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

于 2012-02-14T19:11:15.717 回答
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"];
        }
    }
}

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

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

于 2012-02-14T19:07:38.997 回答