Я использую vb.net для удаленного запуска некоторых команд powershell, вывод powershell.invoke относится к
ObjectModel.Collection(Of PSObject)
Тип.
Я хотел бы передать их в пригодный для использования класс / коллекцию vb.net. Когда я отлаживаю код и наводю курсор на output / 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 (PSObject).
Но после попытки MyBookOwner остается пустым.
Как я могу преобразовать ObjectModel.Collection (Of PSOject) в пригодный для использования объект vb.net.
Основываясь на том, что я вижу о типе 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
Я не думаю, что вы можете сделать простое приведение с выводом. Вот один из способов сделать это (C#, извините) из моего предыдущего ответа: Работа с CimObjects с помощью PowerShell внутри C#