vb.net 将 objectmodel.collection(PSObject 的)的 powershell 输出转换为可用的 VB.net object

vb.net casting a powershell output of objectmodel.collection(of PSObject) to a usable VB.net object

我正在使用 vb.net 远程 运行 一些 powershell 命令,powershell.invoke 的输出是

ObjectModel.Collection(Of PSObject)

类型。

我想将这些转换为可用 vb.net class / collection。当我调试代码并将鼠标悬停在输出 / ObjectModel.Collection(Of PSObject) 上时,数据显示为;

(0) {@{Name=John;Books=System.Collections.ArrayList}}
(1) {@{Name=Gerry;Books=System.Collections.ArrayList}}

如何将其转换为可用 vb.net class/object?

我试过像这样自定义 class;

Class BookOwner
     public name as string
     public Books as systems.collections.arraylist
end class

然后将其投射到 object;

dim MyBookOwner as BookOwner = trycast(Output(0).BaseObject, BookOwner)

输出是 objectmodel.collection(属于 PSObject)类型。

但是在 trycast 之后,MyBookOwner 仍然是空的。

如何将 ObjectModel.Collection(Of PSOject) 转换为可用的 vb.net object.

根据我对 PSObject 类型的了解并且没有进行任何实际测试,我认为您可以这样做:

Dim bookOwners As New List(Of BookOwner)

For Each pso In myPsObjectCollection
    Dim props = pso.Properties
    Dim name = CStr(props.Single(Function(pspi) pspi.Name = "Name").Value)
    Dim books = DirectCast(props.Single(Function(pspi) pspi.Name = "Books").Value, ArrayList)

    bookOwners.Add(New BookOwner With (.Name = name, .Books = books})
Next

当然,如果需要,您也可以将其压缩为 LINQ 查询。

感谢jmcilhinney和boxdog的帮助,信息很有用。

jmcilhinney 的想法是为每个做一个法线,而使用 .members 是在 boxdog 的例子中。所以我结合了你的两个建议来结束这个;

dim AllBooks as new list(of BookOwner)

for each a as psobject in output
      dim abc as psobject = a.members("Books").value 
      AllBooks.add(new BookOwner with {.Name = A.Members("Name").value,
                                       .Books = tryCast(abc.BaseObject, ArrayList)})
next

我很惊讶这不起作用;

for each a as psobject in output
      AllBooks.add(new BookOwner with {.Name = A.Members("Name").value,
                                       .Books = tryCast(A.Members("Books").value.BaseObject, ArrayList)})
next