如何解析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);
                }
            }
        }

这是我的结果数据的简短截图:

然后我可以用这些数据在代码中做任何我想做的事。至少我会这样做。