その他

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をシェルと考えているといろいろ問題が出るので気をつけないといけない。

スポンサーリンク

スポンサーリンク