.NET: чтение вывода командной строки

Я хочу вызвать команду netsh из .net, я использую класс Process, чтобы инициировать процесс, который вызывает команду netsh, и он работает нормально, теперь я хочу получить результат, возвращаемый командой netsh в .NET, например Я вызываю следующую команду в Process:

netsh wlan show hostednetwork

это возвращает мне список активных размещенных сетей.

Как я могу прочитать список в .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 и т. Д. (Индивидуально)?


person Abbas    schedule 14.02.2012    source источник


Ответы (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.

person Sergey Vyacheslavovich Brunov    schedule 14.02.2012
comment
спасибо за вашу помощь, я обновил свой вопрос, вы можете мне помочь - person Abbas; 14.02.2012
comment
@Abbas, также взгляните на Как мне узнать доступные точки доступа Wi-Fi и уровень их сигнала в .net?. - person Sergey Vyacheslavovich Brunov; 15.02.2012

Используйте свойство StandardOutput класса Process.
На указанной выше странице MSDN приведен простой пример использования StandardOutput.

person Albin Sunnanbo    schedule 14.02.2012

Перед запуском процесса необходимо установить StartInfo.UseShellExecute в значение false и RedirectStandardOutput в значение true, а затем читать из Process.StandardOutput.

Все задокументировано в MSDN здесь: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx

person Chris Shain    schedule 14.02.2012

Должно получиться примерно так:

//@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"];
        }
    }
}

К сожалению, я не могу протестировать его на банкомате, чтобы исправить какие-либо мелкие ошибки.

Кроме того, если вы собираетесь часто ссылаться на них, я бы поместил их в Словарь после синтаксического анализа, чтобы сократить время поиска.

person crush    schedule 14.02.2012
comment
спасибо за вашу помощь, я обновил свой вопрос, вы можете мне помочь - person Abbas; 14.02.2012
comment
Можете ли вы привести пример, скажем, например, я хочу получить значение режима - person Abbas; 15.02.2012