PowerShellの型変換は結構強力? というか、動作を理解していないと疑問に感じることが多いです。
そのいい例がスクリプトブロック利用時にint
で受け入れられる動きです。
簡単なテストFunction
シンプルなテストを書きます。
Function Test-Function{ param( [Parameter(ValueFromPipeline=$true)] [Int] $Number, [Parameter(ValueFromPipelineByPropertyName=$true)] [Int] $Number2 ) Process { "number1 : $Number, number 2: $Number2" } }
見ての通り、$numberはValueFromPipelineです。 つまりPipeからの値を受け入れます。
$number2は、ValueFromPipelineByPropertyNmaeです。 よって、PipeからのPropertyNameでのマッチを受け入れます。
単純にこの状態で、テストしましょう。 連番を渡して、-Number2には常に2を指定します。
1..10 | Test-Function -Number2 2
結果は予想されたであろうとおりです。
number1 : 1, number 2: 2 number1 : 2, number 2: 2 number1 : 3, number 2: 2 number1 : 4, number 2: 2 number1 : 5, number 2: 2 number1 : 6, number 2: 2 number1 : 7, number 2: 2 number1 : 8, number 2: 2 number1 : 9, number 2: 2 number1 : 10, number 2: 2
-Numnber2にScriptBlockを指定すると?
-Number2は、[int]と規定しました。 つまり、他の方ではキャストされずに型変換エラーが起きそうです。
では、ScriptBlockを与えてみましょう。
1..10 | Test-Function -Number2 {$_ * 2}
結果は、型変換が暗黙で行われて、ScriptBlockの実行結果が-Number2に渡されています。
number 1 : 1, number 2: 2 number 1 : 2, number 2: 4 number 1 : 3, number 2: 6 number 1 : 4, number 2: 8 number 1 : 5, number 2: 10 number 1 : 6, number 2: 12 number 1 : 7, number 2: 14 number 1 : 8, number 2: 16 number 1 : 9, number 2: 18 number 1 : 10, number 2: 20
どうでしょうか? 奇妙でしょうか。
そこかしこでPowerShellは動的に型変換します。 正直、型をきっちり扱いたいので困ることもあるのですが、「左辺の型に右辺の型が暗黙の型変換される」と覚えておくとわかりやすいですね。