Работа с CimObjects с PowerShell внутри 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
}
Отладка, он получает его внутрь disk
:
Как я должен иметь дело с этим объектом (CimObject
)? Я хотел бы получить значения из свойств "Имя" и "Число".
Просто чтобы уточнить, объект, который я пытаюсь иметь, имеет тот же тип, что и этот (запускайте PowerShell от имени администратора)
PS C:\windows\system32> $disk = Get-Disk -Number 0
PS C:\windows\system32> $disk.GetType();
Как мне с этим взаимодействовать?
Спасибо!
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();