【问题标题】:Dealing with CimObjects with PowerShell inside C#在 C# 中使用 PowerShell 处理 CimObjects
【发布时间】:2018-06-29 10:28:23
【问题描述】:

我有一个执行 PowerShell 脚本的 sn-p

using (var ps = PowerShell.Create())
{
    ps.AddScript("function Test() { return Get-Disk -Number 0 } ");
    ps.Invoke();
    ps.AddCommand("Test");
    var results = ps.Invoke();
    var disk = results.First();

    MyDisk myDisk = // do something to convert disk to myDisk
}

Debuggin,它得到了他的内部disk

我应该如何处理这个对象 (CimObject)?我想从“名称”和“编号”属性中获取值。

澄清一下,我要处理的对象与此类型相同(以管理员身份运行 PowerShell)

PS C:\windows\system32> $disk = Get-Disk -Number 0
PS C:\windows\system32> $disk.GetType();

我如何与之交互?

谢谢!

【问题讨论】:

    标签: c# .net powershell cim


    【解决方案1】:

    我认为没有任何简单的方法可以将 PowerShell 输出转换为更易于处理的格式。您需要“手动”提取所需的属性。例如,您可以像这样获取“AllocatedSize”值:

    var allocatedSize = results.First().Members["AllocatedSize"].Value;
    

    如果您想要基于这些值的自己的类型,那么您可以执行以下操作:

    定义您的类型(更改属性以适合您想要的类型):

    public class MyDisk
    {
       public long AllocatedSize { get; set; }
       public string FriendlyName { get; set; }
       public bool IsBoot { get; set; }
       public int Number { get; set; }
    }
    

    添加一个进行转换的辅助方法:

    private static MyDisk ConvertToMyDisk(PSMemberInfoCollection<PSMemberInfo> item)
    {
        return new MyDisk
        {
            AllocatedSize = long.Parse(item["AllocatedSize")].Value.ToString()),
            FriendlyName = item["FriendlyName"].Value.ToString(),
            IsBoot = bool.Parse(item["IsBoot"].Value.ToString()),
            Number = int.Parse(item["Number"].Value.ToString())
        };
    }
    

    然后您可以使用一些基本的 LINQ 将返回值转换为您自己的类型:

    List<MyDisk> myDisks = results.Select(d => ConvertToMyDisk(d.Members)).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-18
      • 2020-02-22
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多