在 C# 中使用 PowerShell 处理 CimObjects

Dealing with CimObjects with PowerShell inside C#

我有一个执行 PowerShell 脚本的片段

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)?我想从 "Name" 和 "Number" 属性中获取值。

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

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

我如何与之互动?

谢谢!

我认为没有任何简单的方法可以将 PowerShell 输出转换为更易于处理的格式。您需要 'manually' 拉出您想要的属性。例如,您可以获得这样的 '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 将 return 值转换为您自己的类型:

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