在C#中使用PowerShell处理CimObjects
我有一个执行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
)? 我想从“名称”和“数字”属性中获取值。
只是为了澄清,我想要处理的对象与此类型相同(作为管理员运行到PowerShell)
PS C:\windows\system32> $disk = Get-Disk -Number 0 PS C:\windows\system32> $disk.GetType();
我该如何与此互动?
谢谢!
我认为没有任何简单的方法可以将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 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 myDisks = results.Select(d => ConvertToMyDisk(d.Members)).ToList();