我有一个运行PowerShell脚本的应用程序,我需要保存powershell脚本返回的数据。
可能传递给应用程序的脚本示例是:
Get-NetAdapter | Select-Object -Property name, status
以下是运行脚本并保存结果的C#代码:
PowerShell powershell = PowerShell.Create();
powershell.Runspace = RunspaceFactory.CreateRunspace();
powershell.Runspace.Open();
powershell.AddScript(scriptText);
var results = powershell.Invoke();
然后我过滤返回集合的成员以找到我真正想要的那些
var firstobject = results[0].Members;
foreach(PSMemberInfo memberInfo in firstobject)
{
if (!listOfStrings.Contains(memberInfo.Name))
{
//Do something with this -- stuck
}
}
目标是不对任何东西进行硬编码,所以我需要动态创建一个表或其他东西,它可以保存我的返回memberinfo(可以是任意数量的属性) 然后我需要获取所述memberinfo属性的返回值,然后以适当的格式将其保存到SQL表中。
我是否遗漏了powershell输出中的内容,或者是否有一个框架来格式化输出以便更容易使用?
除了项目数量和属性名称之外,如何保存我不知道的任何数据?
我正在考虑将数据保存到SQL表中,然后将其加载到某种视图中。
我正在尝试找到适用于任意数量属性的解决方案 任何帮助将不胜感激。
答案 0 :(得分:1)
尝试使用这样的Dictionary对象或创建自定义类并将每个PSMemberInfo对象存储到列表中。所以你的表可能只是名称,价值和其他元数据。尝试评论我们的另一个scriptText,它有不同的属性,仍然字典对象获取所有属性。出于演示目的,我只使用结果集中的一个对象
更新:脚本中没有第一个但只是为了获取正在返回的对象的类型我正在powershell.Invoke().First().Members
。
static void Main(string[] args)
{
//var scriptText = "Get-Process | Select *";
//var scriptText = "Get-Service";
var scriptText = "Get-Service | Select ServiceName, Status";
PowerShell powershell = PowerShell.Create();
powershell.Runspace = RunspaceFactory.CreateRunspace();
powershell.Runspace.Open();
powershell.AddScript(scriptText);
Dictionary<string, object> dictprop = new Dictionary<string, object>();
foreach (PSMemberInfo item in powershell.Invoke().First().Members)
{
try
{
dictprop.Add(item.Name, item.Value);
Console.WriteLine("Name = {0}, Value = {1}", item.Name, item.Value);
}
catch (Exception ex)
{
//Null Value invocation exception.
}
}
Console.Read();
}