如何解析txt文件中的netstat输出,并根据PID获取所有远程ip地址作为变量?
How to parse netstat output in a txt file and get all the remote ip addresses as variables according to PID?
背景
我尝试编写代码所需的桌面 WPF 应用程序允许我当前 select processes/applications 在本地计算机上 运行 并获取应用程序名称和 PID 并将其存储在多变的。
每次用户在 select 进程后单击按钮后加载应用程序时,都会执行 netstat -ano > C:\test.txt
。
问题
有没有办法编码,使之前获取的应用程序名称和PID可以与test.txt
文件中匹配的PID行进行比较,然后将远程ip地址存储到变量中) 还是一个数组?谢谢。
为什么要有文本文件?下面是我将如何解决这个问题,使用 DataTable 来存储和收集数据:
//Create the process
using (Process ns = new Process())
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] {
new DataColumn("Protocol"),
new DataColumn("Local Address"),
new DataColumn("Foreign Address"),
new DataColumn("State"),
new DataColumn("PID"),
new DataColumn("Process Name"),
});
ProcessStartInfo psi = new ProcessStartInfo("netstat.exe", "-ano");
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
ns.StartInfo = psi;
// Run it, and read the results
ns.Start();
using (StreamReader r = ns.StandardOutput)
{
string output = r.ReadToEnd();
ns.WaitForExit();
//Parse those results into a DataTable, polling the Process info
string[] lines = output.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
foreach (string line in lines)
{
string[] elements = line.Split(' ');
if (elements.Length < 5) continue;
if (elements.Contains("Proto")) continue;
DataRow dr = dt.NewRow();
List<string> validElements = new List<string>();
//Weed out empty elements.
foreach (string element in elements)
{
//skip blanks
if (element.Trim() == "") continue;
validElements.Add(element);
}
foreach (string element in validElements)
{
foreach (DataColumn dc in dt.Columns)
{
// fill in the buckets. Note that UDP doesn't have a state
if (dr["Protocol"].ToString() == "UDP" && dc.ColumnName == "State") continue;
if (dr[dc] == DBNull.Value)
{
dr[dc] = element;
break;
}
}
}
dr["Process Name"] = Process.GetProcessById(int.Parse(dr["PID"].ToString())).ProcessName;
dt.Rows.Add(dr);
}
}
}
这是我的结果数据的简短截图:
然后我可以用这些数据在代码中做任何我想做的事。至少我会这样做。
背景
我尝试编写代码所需的桌面 WPF 应用程序允许我当前 select processes/applications 在本地计算机上 运行 并获取应用程序名称和 PID 并将其存储在多变的。
每次用户在 select 进程后单击按钮后加载应用程序时,都会执行 netstat -ano > C:\test.txt
。
问题
有没有办法编码,使之前获取的应用程序名称和PID可以与test.txt
文件中匹配的PID行进行比较,然后将远程ip地址存储到变量中) 还是一个数组?谢谢。
为什么要有文本文件?下面是我将如何解决这个问题,使用 DataTable 来存储和收集数据:
//Create the process
using (Process ns = new Process())
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] {
new DataColumn("Protocol"),
new DataColumn("Local Address"),
new DataColumn("Foreign Address"),
new DataColumn("State"),
new DataColumn("PID"),
new DataColumn("Process Name"),
});
ProcessStartInfo psi = new ProcessStartInfo("netstat.exe", "-ano");
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
ns.StartInfo = psi;
// Run it, and read the results
ns.Start();
using (StreamReader r = ns.StandardOutput)
{
string output = r.ReadToEnd();
ns.WaitForExit();
//Parse those results into a DataTable, polling the Process info
string[] lines = output.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
foreach (string line in lines)
{
string[] elements = line.Split(' ');
if (elements.Length < 5) continue;
if (elements.Contains("Proto")) continue;
DataRow dr = dt.NewRow();
List<string> validElements = new List<string>();
//Weed out empty elements.
foreach (string element in elements)
{
//skip blanks
if (element.Trim() == "") continue;
validElements.Add(element);
}
foreach (string element in validElements)
{
foreach (DataColumn dc in dt.Columns)
{
// fill in the buckets. Note that UDP doesn't have a state
if (dr["Protocol"].ToString() == "UDP" && dc.ColumnName == "State") continue;
if (dr[dc] == DBNull.Value)
{
dr[dc] = element;
break;
}
}
}
dr["Process Name"] = Process.GetProcessById(int.Parse(dr["PID"].ToString())).ProcessName;
dt.Rows.Add(dr);
}
}
}
这是我的结果数据的简短截图:
然后我可以用这些数据在代码中做任何我想做的事。至少我会这样做。