powershellスクリプトブロックを呼び出すと(.Invoke()
メソッドを呼び出すことによって)常にコレクションが生成されるようです。具体的には、タイプ.Invoke()を使用してPowershellスクリプトブロックを呼び出すと、コレクションが返されるのはなぜですか?
System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]
あっても、空のスクリプトブロック({}.Invoke()
)を呼び出すのコレクションは、コレクションを返します。呼び出し演算子(&
)を使用して同じスクリプトブロックを呼び出すと、通常は期待される復帰(スカラーまたは[object[]]
)が生成されます。
これは、配列の代わりにコレクションが必要な場合に便利ですが、直感的ではないようです。
誰でもこのように動作する理由を知っていますか?
編集:
私は2つの異なる呼び出し、言語仕様を読んでから.Invoke()
と.InvokeReturnAsIs()
があります知っていました。それは私が最初に気づいたことです。
命名規則の背後にある理由と、その仕組みがどのように動作するかは分かりません。ドキュメントを見ると、デフォルトの呼び出しメソッドと思われるものは、Powershellでscriptblockが呼び出されたときに使用されるものではありません。 .InvokeReturnAsIs()
はオブジェクトのストリームを返すだけで、Powershellはオブジェクトが複数ある場合はオブジェクト配列に、オブジェクトが1つのみの場合はスカラーとして、また暗黙の場合は存在しない場合はnullオブジェクトを作成します。そこにパイプライン。 .Invoke()
を使うと常にコレクションが返され、Powershellはそれをコレクションとして残します。
私はこれをしたときにコレクションとして駄目だと思った:({} .invoke).gettype() – mjolinor
'Get-Member -InputObject({} .invoke())'は、コレクションを返します。逆に '$ null -eq {} .Invoke()'は '$ False'を返します。返されるコレクションは_empty_です。そのため、コンソールには何も出力されません。 – mklement0