9

(メソッドを呼び出すことによって) Powershell スクリプト ブロックを呼び出すと、.Invoke()常にコレクションが生成されるようです。具体的には、型のコレクション

System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]

空のスクリプト ブロック ( {}.Invoke()) を呼び出しても、コレクションが返されます。呼び出し演算子 ( ) を使用して同じスクリプト ブロックを呼び出すと&、通常期待される戻り値 (スカラーまたは[object[]]) が生成されます。

これは、配列ではなくコレクションが必要な場合に便利ですが、直感に反するように思えます。

なぜこのように振る舞うのか誰にも分かりますか?

編集:

.Invoke()2 つの異なる呼び出しがあることと.InvokeReturnAsIs()、言語仕様を読むことから知っていました。そこで初めて気が付きました。

命名規則の背後にある理由と、その仕組みが機能しているように見える方法がわかりません。ドキュメントを見ると、デフォルトの呼び出し方法だと思っていたのは、スクリプトブロックが Powershell で呼び出されたときに使用されるものではありません。オブジェクトのストリームを返すだけのように見え.InvokeReturnAsIs()ます。Powershell は、複数のオブジェクトがある場合はオブジェクト配列にラップし、オブジェクトが 1 つしかない場合はスカラーとしてラップします。オブジェクトがない場合は、暗黙的なパイプラインがあるかのように null オブジェクトを作成します。そこの。Using.Invoke()は常にコレクションを返し、Powershell はそれをコレクションのままにします。

4

3 に答える 3

11

これら2つの方法の違いのようです:

Invoke - 指定された引数でスクリプト ブロックを呼び出し、結果を PSObject オブジェクトとして返します。

InvokeReturnAsIs - 指定された引数でスクリプト ブロックを実行します。このメソッドは、生の (ラップされていない) 結果オブジェクトを返すため、より効率的です。

http://msdn.microsoft.com/en-us/library/system.management.automation.scriptblock_methods(v=vs.85).aspx

呼び出す

$code = {"a"}
$code.Invoke().Gettype().FullName

出力:

System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]

InvokeReturnAsIs

$code.InvokeReturnAsIs().GetType().FullName

出力:

System.String
于 2012-01-27T05:08:36.957 に答える
1

それがそのように設計されており、代替手段があるからです!

Invoke- 指定された引数でスクリプト ブロックを呼び出し、結果を PSObject オブジェクト (のコレクション) として返します。

InvokeReturnAsIs- 指定された引数でスクリプト ブロックを実行します。このメソッドは、生の (ラップされていない) 結果オブジェクトを返すため、より効率的です。

また、{}.invoke()null を返すので、それでもコレクションを返すという印象がどこにあるのかわかりません。

http://msdn.microsoft.com/en-us/library/system.management.automation.scriptblock.invokereturnasis(v=vs.85).aspx

于 2012-01-27T05:10:59.280 に答える