在 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();
我有一个执行 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();