[Powershell] パイプラインでつなげたWhere-Object内でif文をつかう

はじめに

if文を使ってWhere-ObjectのCmdletを実行したい場合の方法を備忘録として残しておきます。

実行環境

カテゴリ内容
OSWindows 11 Pro 22H2
PSVersion5.1.22621.1778

Where-Objectの呼び出しに条件ロジックを組み込む

基本的にパイプラインではif文などのような条件文を全体に対して直接使うことはできません。

"ComputerName","IPAddress","Remark"
"A0001","10.0.0.1","Sample001"
"A0002","10.0.0.2","Sample002"
"A0003","10.0.0.3","Sample003"
"A0004","10.0.0.4","Sample004"

まずはエラーとなるケースを見てみます。
パイプライン中にif文を使って条件分岐させてみます。

# エラーとなるケース
Import-Csv "C:\Test\sample.csv" | if ($execFlg -eq $true) { Where-Object {$_.ComputerName = 'A0001'}}

# エラー内容
if : 用語 'if' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパ
スが正しいことを確認してから、再試行してください。

ifというコマンドレットが認識できないのでエラーとなります。
ですので、条件分岐したい場合はWhere-Object内に組み込む必要があります。

$execFlg = $true
$result = Import-Csv "C:\Test\sample.csv" | Where-Object {
    if($execFlg -eq $true) {
        $_.ComputerName -eq 'A0001'
    } else {
        $_.ComputerName -eq 'A0002'
    }
}

# Result
ComputerName IPAddress Remark   
------------ --------- ------   
A0001        10.0.0.1  Sample001

最後に

Where-Object内に組み込めばif文などが利用できるようになります。
同様にSelect-Objectなどでも利用することができますので、是非ご参考までに!

タイトルとURLをコピーしました