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
我正在使用 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