C# 在C中解析PowerShell输出#

C# 在C中解析PowerShell输出#,c#,parsing,powershell,output,C#,Parsing,Powershell,Output,如何在C#中解析powerShell控制台的输出 PowerShell控制台输出: Name : 0F06B9DF-9FC5-4AF7-AF92-890AAD415000 ElementName : Virtual Machine 1 Name : 2B501DD8-46F5-45FE-ACCE-62030720A000 ElementName : Virtual Machine 2 在我的C代码中,逐行读取输出。我搜索将输出转换为 List<Diction

如何在C#中解析powerShell控制台的输出

PowerShell控制台输出:

Name        : 0F06B9DF-9FC5-4AF7-AF92-890AAD415000
ElementName : Virtual Machine 1

Name        : 2B501DD8-46F5-45FE-ACCE-62030720A000
ElementName : Virtual Machine 2
在我的C代码中,逐行读取输出。我搜索将输出转换为

List<Dictionary<string, string>> 
列表
我试过了

bool dataset = false;
Dictionary<string, string> data = new Dictionary<string, string>();
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
    // The line of Output
    string line = proc.StandardOutput.ReadLine();

    // If line is not empty save data in dictionary
    if(line.Length != 0)
    {
        dataset = true;
        string[] vals = line.Split(':');
        data.Add(vals[0], vals[1]);
    }
    // Else, save dictionary in list and reinit dictionary
    else
    {
        // Next object
        if (dataset)
        { 
            arr.Add(data);
            dataset = false;
            data = new Dictionary<string, string>();
        }
    }
}
bool数据集=false;
字典数据=新字典();
proc.Start();
而(!proc.StandardOutput.EndOfStream)
{
//输出线
string line=proc.StandardOutput.ReadLine();
//若行不为空,则在字典中保存数据
if(line.Length!=0)
{
数据集=真;
string[]vals=line.Split(':');
添加数据(VAL[0],VAL[1]);
}
//否则,将字典保存在列表中并重新编辑字典
其他的
{
//下一个目标
如果(数据集)
{ 
arr.Add(数据);
数据集=假;
数据=新字典();
}
}
}

如果进程很快完成,并且没有提供很多输出,那么最好等待它退出,然后立即读取所有标准输出流

proc.WaitForExit((int)TimeSpan.FromSeconds(10).TotalMilliseconds);

var ret = new List<Dictionary<string, string>>();

// first split on double newline to separate VMs
string[] vms = proc.StandardOutput.ReadToEnd()
    .Split(new[] { string.Format("{0}{0}", Environment.NewLine) }, StringSplitOptions.RemoveEmptyEntries);

foreach (var vm in vms)
{
    // then split on newline, to get each line in separate string
    var lines = vm.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

    // finally, split each line on ':' to fill in dictionary, then add it to list
    ret.Add(lines.Select(line => line.Split(':')).ToDictionary(a => a[0].Trim(), a => a[1].Trim()));
}
proc.WaitForExit((int)TimeSpan.FromSeconds(10.total毫秒);
var ret=新列表();
//首先在双换行符上拆分以分离虚拟机
字符串[]vms=proc.StandardOutput.ReadToEnd()
.Split(新[]{string.Format(“{0}{0}”,Environment.NewLine)},StringSplitOptions.RemoveEmptyEntries);
foreach(vms中的var-vm)
{
//然后在换行符上拆分,使每一行成为单独的字符串
var lines=vm.Split(new[]{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries);
//最后,拆分“:”上的每一行以填写字典,然后将其添加到列表中
ret.Add(lines.Select(line=>line.Split(':')).ToDictionary(a=>a[0].Trim(),a=>a[1].Trim());
}

如果进程输出的格式与您期望的格式不符,您可能还希望将其包装在
try…catch
中。

如果进程很快完成并且没有提供大量输出,那么最好等待它退出,然后立即读取所有标准输出流

proc.WaitForExit((int)TimeSpan.FromSeconds(10).TotalMilliseconds);

var ret = new List<Dictionary<string, string>>();

// first split on double newline to separate VMs
string[] vms = proc.StandardOutput.ReadToEnd()
    .Split(new[] { string.Format("{0}{0}", Environment.NewLine) }, StringSplitOptions.RemoveEmptyEntries);

foreach (var vm in vms)
{
    // then split on newline, to get each line in separate string
    var lines = vm.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

    // finally, split each line on ':' to fill in dictionary, then add it to list
    ret.Add(lines.Select(line => line.Split(':')).ToDictionary(a => a[0].Trim(), a => a[1].Trim()));
}
proc.WaitForExit((int)TimeSpan.FromSeconds(10.total毫秒);
var ret=新列表();
//首先在双换行符上拆分以分离虚拟机
字符串[]vms=proc.StandardOutput.ReadToEnd()
.Split(新[]{string.Format(“{0}{0}”,Environment.NewLine)},StringSplitOptions.RemoveEmptyEntries);
foreach(vms中的var-vm)
{
//然后在换行符上拆分,使每一行成为单独的字符串
var lines=vm.Split(new[]{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries);
//最后,拆分“:”上的每一行以填写字典,然后将其添加到列表中
ret.Add(lines.Select(line=>line.Split(':')).ToDictionary(a=>a[0].Trim(),a=>a[1].Trim());
}
如果进程输出的格式与您期望的格式不符,您可能还希望将其包装在
try…catch
中。

来吧!C#和Powershell—这两种.Net语言。您可以从C#中调用Powershell脚本,并将输出作为对象。无需解析任何内容:

    static void Main(string[] args)
    {
        var rsc = RunspaceConfiguration.Create();
        var runSpace = RunspaceFactory.CreateRunspace(rsc);
        runSpace.Open();
        Runspace.DefaultRunspace = runSpace;
        var p = runSpace.CreatePipeline("Get-Process");

        var output = p.Invoke();

        foreach (var o in output)
        {
            Console.WriteLine("{0}", o.Properties["Name"].Value);
        }
    }
来吧!C#和Powershell—这两种.Net语言。您可以从C#中调用Powershell脚本,并将输出作为对象。无需解析任何内容:

    static void Main(string[] args)
    {
        var rsc = RunspaceConfiguration.Create();
        var runSpace = RunspaceFactory.CreateRunspace(rsc);
        runSpace.Open();
        Runspace.DefaultRunspace = runSpace;
        var p = runSpace.CreatePipeline("Get-Process");

        var output = p.Invoke();

        foreach (var o in output)
        {
            Console.WriteLine("{0}", o.Properties["Name"].Value);
        }
    }

您可能希望显示用于生成该输出的命令。如果只需要一个字符串字典就足够了,为什么还要一个字典列表?在我的情况下,如何使用字符串字典?附言:我添加了我使用的代码。你所观察到的方法的问题是什么?它以什么方式不起作用?它起作用了,但我搜索了执行此任务的最佳方式。您可能希望显示用于生成该输出的命令。为什么只需要一个字符串字典就足够了,却需要一个字典列表?在我的情况下,如何使用字符串字典?附言:我添加了我使用的代码。你所观察到的方法的问题是什么?什么方法不起作用?它起作用了,但我在寻找完成这项任务的最佳方法。我不能这样做。我忘了说在Server2008PowerShellV2.0上运行。我没有系统、管理、自动化。我正在使用这个库:我不能这样做。我忘了说在Server2008PowerShellV2.0上运行。我没有系统、管理、自动化。我正在使用这个库:我不需要在列表中添加字典的循环?我收到错误:已经添加了一个具有相同键的项。我编辑了我的答案,它现在应该可以为您工作,并输出
列表
,每个VM都是一个单独的
字典
。但这是一种丑陋的解决方案-我建议采用@n0rd建议的路径,如果可以,将Powershell输出作为对象获取。我不需要循环来将字典添加到列表中?我收到错误:已经添加了一个具有相同键的项。我编辑了我的答案,它现在应该可以为您工作,并输出
列表
,每个VM都是一个单独的
字典
。但这是一种丑陋的解决方案-我建议采用@n0rd建议的路径,如果可以的话,将Powershell输出作为对象。