今更ながら基本の基本を確認しておく。
IF文での判定条件は普通に考えると、
if($a –eq 1){hogehoge}
てな感じに書くのが一般的な気がする。
ただし、これは一般的な他の言語と同様な書き方で一見何の問題も無いように見えるが、PowerShellの場合はちょっと事情が異なる。
例えば以前PowerShell: ◆配列をフィルターするで書いたように、配列などではイコール演算子が感覚とはちょっと違った動作をする。
この間、PowerShell: ◆閾値以下の空き容量のHDドライブがあったら警告するで使った抽出判定も、
if(Get-PSDrive | ?{$_.USED –ne “”}){hogehoge}
ってな感じでは旨くいかない。(余計なものが幾つか残ってしまう)
では、どうすればよいのか。
昔からなんとなく使っている以下の書き方が実は正しい書き方なのではと最近思っている。
if($a){hogehoge}
こう書いた場合、どう判定されるかというと(経験的に)、その変数のデータ型の初期値であればFalse、初期値以外がTrueになる。
数値であれば、0がFalse、文字列であれば””がFalse、オブジェクトであればNullがFalseといった具合。
配列がちょっと厄介だが、要素が複数の場合はTrue、ひとつの場合はその変数の属性に応じて上記と同様に判定される。
この機能はおそらく、PowerShellが$aをbool型に自動変換しているのだろう。
即ち、
if([bool]$a){hogehoge}
と書くのと同じではないかと思う。
先に書いた、
if(Get-PSDrive | ?{$_.USED –ne “”}){hogehoge}
のパターンでは、USEDプロパティがスクリプトプロパティなので、ドライブによってUSEDのデータ型が違ってきている。
なので、演算子を直接使って判定しようとすると
てな感じになってしまう。
これはやはり普段から
if($a){hogehoge}
の書き方を使うのが良いのだろうと思う。
ちなみに、「-ne」の場合は「!」を使って(!$a)とする。
あくまでも、経験則で考えたものですが・・・・。
0 件のコメント:
コメントを投稿