0

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

ObjectModel.Collection(Of PSObject)

类型。

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

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

如何将其转换为可用的 vb.net 类/对象?

我试着像这样制作一个自定义类;

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

然后将其投射到对象上;

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

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

但是在试播之后,MyBookOwner 保持为空。

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

4

2 回答 2

1

根据我所看到的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 查询。

于 2018-08-10T07:37:43.530 回答
0

感谢 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
于 2018-08-10T09:07:11.437 回答