如何从 netsh 的标准输出中提取特定字符串?
How do I pull specific strings out of the standard output of 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();
}
文本框中的结果 return 如下所示:
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# 中执行此操作?
您正在寻找 Regular Expressions。 Regex 允许您定义一个模式以在更大的字符串中查找。这将允许您从从标准输出返回的字符串中提取字符串列表(网络名称)。
要匹配模式 "All User Profile [whitespace]: [name]",您可以使用此正则表达式模式:
All User Profile[\s]+: (.*)
如果满足以下条件,则在此模式的较大字符串中找到匹配项:
- 文字串"All User Profile"出现
- 后跟一个或多个白色space字符 -
[\s]+
)
- 后跟一个冒号和一个 space
- 后跟一个未确定长度的字符串 -
(.*)
(但以换行符结尾)
您可以使用 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
的一个或多个结果,并将它们全部添加到结果列表中。
这里有一个fiddle来演示:https://dotnetfiddle.net/vhkUV5
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));
}
}
我正在使用 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();
}
文本框中的结果 return 如下所示:
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# 中执行此操作?
您正在寻找 Regular Expressions。 Regex 允许您定义一个模式以在更大的字符串中查找。这将允许您从从标准输出返回的字符串中提取字符串列表(网络名称)。
要匹配模式 "All User Profile [whitespace]: [name]",您可以使用此正则表达式模式:
All User Profile[\s]+: (.*)
如果满足以下条件,则在此模式的较大字符串中找到匹配项:
- 文字串"All User Profile"出现
- 后跟一个或多个白色space字符 -
[\s]+
) - 后跟一个冒号和一个 space
- 后跟一个未确定长度的字符串 -
(.*)
(但以换行符结尾)
您可以使用 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
的一个或多个结果,并将它们全部添加到结果列表中。
这里有一个fiddle来演示:https://dotnetfiddle.net/vhkUV5
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));
}
}