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 返回字符串而不是对象。

我的问题是,我应该使用哪种方法,为什么?在我看来,它们都一样。

4

1 回答 1

1

让我们开始一一理解:

PowerShell 对象: 提供用于创建命令管道并在运行空间内同步或异步调用这些命令的方法。此类还提供对包含在调用命令时生成的数据的输出流的访问。此类主要用于以编程方式使用 Windows PowerShell 执行任务的宿主应用程序。此处的管道专用于宿主应用程序,您可以特定于 PowerShell 对象。这也保证了即使命令是同步和异步发送的,您也可以访问 powershell 结果数据。

RunspaceInvoke:允许执行来自 CLR 语言的命令。如果宿主应用程序需要显式定义管道,则不能使用它。这将使用现有的对象管道并为您添加 Powershell 命令。您可能在管道中有其他命令,并且还将包含 powershell 命令。在这里,您正在使用 CLR 管道对象并向其添加更多命令,并且管道不是您的应用程序所独有的。

最后我想说的是,使用 Powershell 对象是在任何将托管 Powershell 对象的应用程序中使用的最佳选择。

于 2012-05-18T01:34:53.777 回答