続PowerShell 2.0つらみばなし

PowerShellアドベントカレンダーで書くつもりでいたら時間なくて急いで書いたせいで漏れた小ネタを書いておく。

対象のパスにアイテムがあるか調べるために以下のように書くことがある。

(Get-ChildItem -Path $path).Count -eq 0

子アイテムが無い場合カウントは0なのでtrueがかえることを期待するが実際はfalseが返る。

(Get-ChildItem -Path $path).Count -ne 0

こちらはtrueが返る。

アイテムが0であることを期待して上のようにすると常にfalseが返るようになる。下段はアイテムが0でも常にtrueが返る。 アイテムが1個の場合でもCountが何も返さないので同じ。

理由はアイテムが1つだと返されるのがFileInfoで2個以上だとObject[]だから。v3以上のように変数にCountがあるわけではなく単に配列のCountを読んでいるだけなのでアイテムの数が0または1では判定に失敗する。

(Get-ChildItem -Path $path|Measure-Object|Select-Object -ExpandProperty Count) -eq 0

少なくともCountは失敗しない