Вопрос по vb.net, powershell – Powershell через VB.NET. Какой метод и почему?

2

Мне нужно вызывать команды Powershell через мой код, и я нахожу по крайней мере 2 разных примера этого. Мне интересно, в чем различия между методами и почему я бы использовал один, а не другой.

Первый (более простой?) Метод выглядит примерно так:

Dim command As New PSCommand()
command.AddScript("<Powershell command here>")
Dim powershell As Management.Automation.PowerShell = powershell.Create()
powershell.Commands = command
Dim results = powershell.Invoke()

results теперь содержит коллекцию объектов Powershell, которые можно преобразовать в строки, например:

MsgBox(results.Item(0).ToString())

Второй метод выглядит так:

Dim invoker As New RunspaceInvoke
Dim command As String = "<Powershell command here>"
Dim outputObjects As Collection(Of PSObject) = invoker.Invoke(command)

И тогда я могу перебрать коллекцию возвращаемых объектов и преобразовать в строку таким же образом:

For Each result As PSObject In outputObjects
    Console.WriteLine(result.ToString)
Next

Я также знаю, что с помощью любого метода я могу передать командуout-string заставить Powershell возвращать строки вместо объектов.

У меня вопрос, какой метод я должен использовать и почему? Они оба кажутся мне одинаковыми.

Ваш Ответ

1   ответ
1

Давайте начнем понимать одно за другим:

PowerShell Object:  Предоставляет методы, которые используются для создания конвейера команд и вызова этих команд синхронно или асинхронно в пространстве выполнения. Этот класс также обеспечивает доступ к выходным потокам, которые содержат данные, которые генерируются при вызове команд. Этот класс в первую очередь предназначен для хост-приложений, которые программно используют Windows PowerShell для выполнения задач. Конвейер здесь исключительно для хост-приложения, и вы можете сделать его специфичным для объектов PowerShell. Это также гарантирует, что у вас будет доступ к данным результатов PowerShell, даже когда команды отправляются синхронно и асинхронно.

RunspaceInvoke: Позволяет выполнять команды из языка CLR. Его нельзя использовать, если хост-приложению необходимо явно определить конвейер. Это будет использовать существующий объектный конвейер и добавлять команды Powershell для вас. У вас могут быть другие команды в конвейере, и команды powershell также будут включены. Здесь вы используете объект конвейера CLR и добавляете к нему дополнительные команды, и конвейер не является эксклюзивным для вашего приложения.

Наконец, я бы сказал, что использование объекта Powershell - лучший выбор для использования в любом приложении, в котором будут размещаться объекты Powershell.

Похожие вопросы