tech.guitarrapc.cóm

Technical updates

PowerShellの型変換を使ったValueの受け入れ例

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人ぐらいはいるはず (((