C# 在C中解析PowerShell输出#
如何在C#中解析powerShell控制台的输出 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
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输出作为对象。