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())

2 番目の方法は次のようになります。

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オブジェクト: コマンドのパイプラインを作成し、実行スペース内で同期的または非同期的にそれらのコマンドを呼び出すために使用されるメソッドを提供します。このクラスは、コマンドが呼び出されたときに生成されるデータを含む出力ストリームへのアクセスも提供します。このクラスは主に、WindowsPowerShellをプログラムで使用してタスクを実行するホストアプリケーションを対象としています。ここでのパイプラインはホストアプリケーション専用であり、PowerShellオブジェクトに固有のものにすることができます。これにより、コマンドが同期および非同期で送信された場合でも、PowerShellの結果データにアクセスできることが保証されます。

RunspaceInvoke: CLR言語からのコマンドの実行を許可します。ホストアプリケーションがパイプラインを明示的に定義する必要がある場合は使用できません。これにより、既存のオブジェクトパイプラインが使用され、Powershellコマンドが追加されます。パイプラインに他のコマンドが含まれている可能性があり、PowerShellコマンドも含まれます。ここでは、CLR Pipelineオブジェクトを使用してコマンドを追加していますが、パイプラインはアプリケーション専用ではありません。

最後に、Powershellオブジェクトをホストするアプリケーションで使用するには、Powershellオブジェクトを使用するのが最適です。

于 2012-05-18T01:34:53.777 に答える