PowerShellの型に注意

その他

PowerShellで次のようなコードを実行すると、思うような挙動にならない。

Param(
    [string]$Flag
)

$Flag = $Flag -eq "true"

if ($Flag) {
    Write-Host "true"
}
PS /test> ./test.ps1 -Flag false                                                                                              
true

引数がfalse、trueに関わらず、いつでもtrueが出力される。これはPowerShellに型があることが原因。

Paramの設定で$Flagがstringであると宣言しているため、$Flag -eq "true" の結果が暗黙的にstringにキャストされてしまう。

そのため、別の変数で受けて利用するのが正しい。

Param(
    [string]$Flag
)

$Flag2 = $Flag -eq "true"

Write-Host $Flag2
Write-Host $Flag2.GetType().FullName

if ($Flag2) {
    Write-Host "true"
}
PS /test> ./test.ps1 -Flag false                                                                                              
False
System.Boolean

PS /test> ./test.ps1 -Flag true                                                                                               
True
System.Boolean
true

そもそも$Flag = $Flag -eq "true" がイケてないが、PowerShellをシェルと考えているといろいろ問題が出るので気をつけないといけない。

コメント