PowerShell で If 文を利用した条件分岐を行う

Powershell

PowerShell で If 文を利用した条件分岐について紹介します。

基本構文

If 文の基本的な利用方法です。

If(条件式){
  条件式が$Trueの場合の処理
}

If の後の丸括弧内の条件式の結果が $True となった場合のみ、波括弧内の処理が行われます。

Else や ElseIf の書き方は以下の通りです。

If(条件式1){
  条件式1が$Trueの場合の処理
}ElseIf(条件式2){
  条件式2が$Trueの場合の処理
}Else{
  条件式1,条件式2とも当てはまらない場合の処理
}

比較演算子

PowerShell の比較演算式は以下のようになっています。参考として VBScript の場合の比較演算子も併せて紹介します。

PowershellVBSscript説明 
-eq=等しい
-ne<>等しくない
-lt<より小さい
-le<=以下
-gt>より大きい
-ge>=以上
-likeN/Aワイルドカードでの比較で一致
-notlikeN/Aワイルドカードでの比較で一致しない
-matchN/A正規表現での比較で一致
-notmatchN/A正規表現での比較で一致しない

 VBScript の比較演算子と違い、直感的に分かりづらくなっています。以下の略であることを覚えておけば、利用するときに思い出せるかと思います。

  • eq:equal
  • ne:not equal
  • lt:less than
  • le:less than or equal
  • gt:greater than
  • ge:greater than or equal

また、PowerShell では Like を利用したワイルドカードでの検索や、Match を利用した正規表現での検索も可能となっています。※VBS もオブジェクトを読み込めば正規表現は利用可能です。

比較演算子を利用した条件分岐の例

入力された年齢が 6 才以下で「未就学児」、20 才未満で「未成年」、それ以外は「大人」と表示するスクリプトです。

# C:\Sample.ps1
[int]$age = Read-Host "年齢を入力してください" 

If($age -le 6){
     Write-Host "未就学児" 
}ElseIf($age -lt 20){
     Write-Host "未成年"
}Else{
     Write-Host "成人" 
}
PS C:\> .\Sample1.ps1 年齢を入力してください: 2 未就学児 PS C:\> .\Sample1.ps1 年齢を入力してください: 19 未成年 PS C:\> .\Sample1.ps1 年齢を入力してください: 20 成人

条件式は上から順に評価されます。上記例で条件式 1 と条件式 2 を入れ替えた場合、2 才と入力すると未成年と判定されます。

ワイルドカード、正規表現を利用した条件分岐の例

入力した文字列に "test" という文字列が含まれているかチェックするスクリプトです。

# C:\Sample2.ps1
$Text = Read-Host "文字を入力してください"

If($Text -Like "*test*"){ # 文中にtestが含まれる場合(前後にワイルドカード)
    Write-host "testが含まれます。(-Like)"
}

If($Text -match "^test"){ # 行頭にtestが含まれる場合
    Write-host "testが含まれます。(-match)"
}
PS C:\> .\Sample2.ps1 文字を入力してください: これはtestです。 testが含まれます。(-Like) PS C:\> .\Sample2.ps1 文字を入力してください: testです。 testが含まれます。(-Like) testが含まれます。(-match)

大文字、小文字の判断

利用するケースは稀だと思いますが、ハイフンの後に c を付与すると大文字と小文字の区別が可能となります。 例)-ceq (大文字・小文字も含めて等しいか)

PS C:\> $a = "Test" PS C:\> If($a -eq "TEST"){Write-Host "一致している"}else{Write-Host "一致していない"} 一致している PS C:\> If($a -ceq "TEST"){Write-Host "一致している"}else{Write-Host "一致していない"} 一致していない

論理演算子

複数条件の組み合わせによる条件分岐をする場合は、論理演算子を利用します。こちらも参考として VBScript の場合の論理演算子も併せて紹介します。

PowerShellVBSscript説明
-andAnd論理積
-orOr論理和
-xorXor排他的論理和
-notNot否定

PowerShell も VBScript もほぼ同じですね。他の言語では And を「&&」、Or を「||」と表記するものもあります。

A という条件式と B という条件式があった場合、以下の条件に合致した場合、$True を返します。

  • -and:A の条件式が $True、かつ、B の条件式が $True、かつ、B の条件式が $True
  • -or:A の条件式、または、B の条件式のどちらか、または両方が $True
  • -xor:A の条件式、または、B の条件式のどちらかが $True
  • -not:条件式が $False

論理演算子を利用した条件分岐の例

年齢と性別を入力し、法律的に結婚可能か判断するスクリプトです。

# C:\Sample3.ps1
[int]$age = Read-Host "年齢を入力してください" 
[string]$gender = Read-Host "性別を入力してください" 

If($age -ge 16 -and $gender -eq "女"){
     Write-Host "結婚できます。" 
}ElseIf($age -ge 18){
     Write-Host "結婚できます。" 
}Else{
     Write-Host "結婚できません。" 
}
PS C:\> .\Sample3.ps1 年齢を入力してください: 16 性別を入力してください: 女 結婚できます。 PS C:\> .\Sample3.ps1 年齢を入力してください: 16 性別を入力してください: 男 結婚できません。 PS C:\> .\Sample3.ps1 年齢を入力してください: 18 性別を入力してください: 男 結婚できます。

上記例は少しわかりやすくするために ElseIf を利用しましたが、以下のように組み替えることができます。

[int]$age = Read-Host "年齢を入力してください"
[string]$gender = Read-Host "性別を入力してください"
If(($age -ge 16 -and $gender -eq "女") -or $age -ge 18){ # 論理演算子を組み合わせ
     Write-Host "結婚できます。" 
}Else{
     Write-Host "結婚できません。" 
}

条件式を日本語に起こすと「年齢が 16 才以上、かつ、性別が女、もしくは年齢が 18 歳以上」となります。

論理演算子を組み合わせることで、複雑な条件分岐も可能となりますが、条件式が正しく評価されることを確実に確認しないとバグの原因ともなるので注意しましょう。

コマンドレットによる条件分岐

ここまで演算子を利用した条件分岐を紹介してきましたが、各種コマンドレットで $True を返すものであれば条件分岐に利用できます。

よく使いそうな2つの例を紹介します。

ファイルの有無で条件分岐

ファイルの有無を確認するコマンドレットである「Test-Path」の結果で条件分岐します。C:\test.txt ファイルを事前に作成してあります。

PS C:\> If(Test-Path "C:\test.txt"){Write-Host "ファイルがあります。"}Else{Write-Host "ファイルはありません。"} ファイルがあります。 PS C:\> If(Test-Path "C:\test2.txt"){Write-Host "ファイルがあります。"}Else{Write-Host "ファイルはありません。"} ファイルはありません。

Ping で応答がある場合の条件分岐

Ping と同等の機能を有するコマンドレットである「Test-Connection」の結果で条件分岐します。TestServer は稼働しているサーバーと仮定します。

PS C:\> If(Test-Connection TestServer){ Write-Host "疎通確認が取れました" } 疎通確認が取れました

以上です。

コメント

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