PowerShellの型変換は結構強力?というか、動作を理解していないと???が浮かぶかもしれません。
そのいい例が、scriptblock利用時に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は動的に型変換を行います。
正直、型をきっちり扱いたいので困ることもあるのですが、「左辺の型に右辺の型が暗黙の型変換される」と覚えておくと分かり易いですね。
以上、おそらく ここが変だよPowerShellと思うであろう例でした。 (自分が思ったので他に1人ぐらいはいるはず (((