代码之家  ›  专栏  ›  技术社区  ›  SuperJMN

在C中使用PowerShell处理CIMObjects#

  •  1
  • SuperJMN  · 技术社区  · 6 年前

    我有一个执行PowerShell脚本的代码段

    使用(var ps=powershell.create())
    {
    ps.addscript(“function test()return get disk-number 0”);
    ps.invoke();
    ps.addcommand(“测试”);
    var results=ps.invoke();
    var disk=results.first();
    
    mydisk mydisk=//做点什么把磁盘转换成mydisk
    }
    

    debuggin,它得到了他的内部

    我应该如何处理这个对象(cimObject)?我想从“name”和“number”属性中获取值。

    只是澄清一下,我要处理的对象与此类型相同(作为管理员运行到PowerShell中)。

    ps c:\windows\system32>$disk=get disk-数字0
    ps c:\windows\system32>$disk.gettype();
    

    如何与此交互?

    谢谢!

    德布金,他在里面disk以下内容:

    Debugger Snapshot

    我该怎么处理这个东西(CimObject)是吗?我想从“name”和“number”属性中获取值。

    只是澄清一下,我要处理的对象与此类型相同(作为管理员运行到PowerShell中)

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

    如何与此交互?

    谢谢您!

    1 回复  |  直到 6 年前
        1
  •  1
  •   boxdog    6 年前

    我认为没有任何简单的方法可以将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();