0

我有一个运行 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
    }
}

目标是不对任何东西进行硬编码,因此我需要动态创建一个表或其他东西,它可以保存我的返回成员信息(可以是任意数量的属性),然后我需要它来获取所述成员信息属性的返回值和然后以适当的格式将其保存到 SQL 表中。

我是否在 powershell 输出中遗漏了某些内容,或者是否有一个框架来格式化输出以便更容易使用?

我如何保存我不知道的数据,除了项目的数量和属性的名称?

我正在考虑将数据保存到 SQL 表中,然后从那里将其加载到某种视图中。

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

4

1 回答 1

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();
    }
于 2013-08-17T14:24:37.950 回答