Работа с CimObjects с PowerShell внутри C # - PullRequest
0 голосов
/ 29 июня 2018

У меня есть фрагмент, который выполняет сценарий 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:

Debugger Snapshot

Как я должен иметь дело с этим объектом (CimObject)? Я хотел бы получить значения из свойств «Имя» и «Число».

Просто чтобы уточнить, объект, с которым я пытаюсь иметь дело, относится к тому же типу, что и этот (запустите PowerShell от имени администратора)

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

Как мне с этим взаимодействовать?

Спасибо!

1 Ответ

0 голосов
/ 29 июня 2018

Я не думаю, что есть какой-либо простой способ преобразовать вывод 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();
...