Работа с 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();
Другие вопросы по тегам