保存动态创建的数据+ c#+ powershell

时间:2013-08-16 13:38:55

标签: c# powershell

我有一个运行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表中,然后将其加载到某种视图中。

我正在尝试找到适用于任意数量属性的解决方案 任何帮助将不胜感激。

1 个答案:

答案 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();
    }