tech.guitarrapc.cóm

Technical updates

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

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は動的に型変換します。 正直、型をきっちり扱いたいので困ることもあるのですが、「左辺の型に右辺の型が暗黙の型変換される」と覚えておくとわかりやすいですね。