如何从netsh的标准输出中提取特定字符串?

时间:2015-08-17 23:18:01

标签: c# regex list netsh

我正在使用netsh检查已保存的无线配置文件及其加密状态。我可以像这样捕获netsh的输出:

   private void wifiButton_Click(object sender, EventArgs e)
    {


        Process cmd = new Process();
        cmd.StartInfo.FileName = "netsh.exe";
        System.Threading.Thread.Sleep(50);
        cmd.StartInfo.Arguments = "wlan show profiles";
        cmd.StartInfo.UseShellExecute = false;
        cmd.StartInfo.RedirectStandardOutput = true;
        cmd.StartInfo.RedirectStandardError = true;
        cmd.Start();
        //* Read the output (or the error)
        string output = cmd.StandardOutput.ReadToEnd();
        textBox3.Text = output;
        cmd.WaitForExit();          
    }

结果在文本框中返回,如下所示:

Profiles on interface Wi-Fi:

Group policy profiles (read only)
---------------------------------
<None>

User profiles
-------------
All User Profile     : GuestFSN
All User Profile     : CorporateWifi
All User Profile     : ATT3122

我想提取无线配置文件名称(GuestFSN,CorporateWifi,ATT3122等...)并将它们放入列表中。我如何在C#中执行此操作?

2 个答案:

答案 0 :(得分:2)

您正在寻找Regular Expressions。正则表达式允许您定义要在更大的字符串中查找的模式。这将允许您从标准输出中返回的字符串中提取字符串列表(网络名称)。

要匹配模式&#34;所有用户配置文件[空格]:[名称]&#34;,您可以使用此正则表达式模式:

  

All User Profile[\s]+: (.*)

如果满足以下条件,则在此模式的较大字符串中找到匹配项:

  • 文字字符串&#34;所有用户个人资料&#34;发生
  • 后跟一个或多个空格字符 - [\s]+
  • 后跟冒号和空格
  • 后跟一串未确定的长度 - (.*)(但以换行符结尾)

您可以使用Regex101等工具测试此正则表达式模式。

这是您的方案的代码示例:

var regex = new Regex(@"All User Profile[\s]+: (.*)");
var resultList = new List<string>();

foreach (Match match in regex.Matches(output))
{
    resultList.Add(match.Groups[1]);
}

使用foreach循环,以便我们可以处理来自regex.Matches的一个或多个结果,并将所有结果添加到结果列表中。

这是一个演示的小提琴:https://dotnetfiddle.net/vhkUV5

答案 1 :(得分:0)

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Program
{
public static void Main()
{
    // output would be set by earlier code
    var output = @"Profiles on interface Wi-Fi:

Group policy profiles (read only)
---------------------------------
   <None>

  User profiles
  -------------
            All User Profile     : GuestFSN
            All User Profile     : CorporateWifi
            All User Profile     : ATT3122";

    var regex = new Regex(@"All User Profile[\s]+: (.*)");
    var resultList = new List<string>();

    foreach (Match match in regex.Matches(output))
    {
        resultList.Add(match.Groups[1].ToString());
    }

    Console.WriteLine(string.Join(", ", resultList));
}
}