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才以下で「未就学児」、18才以下で「学生」、それ以外は「大人」と表示するスクリプトです。

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

If($age -le 6){
    Write-Host "未就学児"
}ElseIf($age -le 18){
    Write-Host "学生"
}Else{
    Write-Host "大人"
}
  実行結果
PS C:\> .\Sample1.ps1
年齢を入力してください: 2
未就学児
PS C:\> .\Sample1.ps1
年齢を入力してください: 18
学生
PS C:\> .\Sample1.ps1
年齢を入力してください: 30
大人

上記例で2才の場合、ElseIfの$age -le 18にも当てはまりますが、上から順に評価されます。条件式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 "疎通確認が取れました" }
疎通確認が取れました
以上です。

コメント