【初心者向け】Windows PowerShellのif文の使い方|条件分岐をマスターしよう!

Windows

Windows PowerShellでは、条件に応じて処理を切り替えることができます。

そのために使うのが「if文(イフぶん)」です。

こんな場面で活躍します:

  • 「もしファイルが存在したら実行する」
  • 「もしエラーがなければ次の処理に進む」
  • 「もし特定の条件なら別の処理をする」
  • 「もし管理者権限がなければ警告を出す」

このような処理を組みたいとき、if文は絶対に覚えておきたい基本構文です。

この記事では、PowerShellにおけるif文の使い方と、初心者がつまずきやすいポイントを実例付きでわかりやすく解説します。

スポンサーリンク

PowerShellとは?if文が使える環境

PowerShellの基本

PowerShellとは:

  • Windowsに標準搭載されている高機能なコマンドライン環境
  • .NETベースで作られており、オブジェクト指向プログラミングが可能
  • システム管理、自動化、バッチ処理に強力

PowerShellの起動方法

方法手順用途
スタートメニュースタート → 「PowerShell」と検索一般的な利用
Win + XWin + X → 「Windows PowerShell」素早いアクセス
管理者権限右クリック → 「管理者として実行」システム管理作業
エクスプローラーShift + 右クリック → 「PowerShellを開く」そのフォルダで作業

コマンドプロンプトとの違い

項目コマンドプロンプトPowerShell
データ型文字列のみオブジェクト
演算子限定的豊富
条件分岐限定的柔軟
学習コスト低い中程度

PowerShellのif文の基本構文

最もシンプルな形

if (条件) {
    処理
}

重要なポイント:

  • 条件は必ず () で囲む
  • 処理は必ず {} で囲む
  • 大文字小文字は区別されないIfifも同じ)

基本例:数値の比較

$number = 10

if ($number -gt 5) {
    Write-Host "5より大きいです"
}

出力: 5より大きいです

解説:

  • $number:変数(値を格納する箱)
  • -gt:「greater than」(より大きい)
  • Write-Host:画面に文字を表示

より実用的な例

# 現在の時刻に応じて挨拶を変える
$hour = (Get-Date).Hour

if ($hour -lt 12) {
    Write-Host "おはようございます!"
}

動作:

  • 現在時刻が12時前なら「おはようございます!」と表示
  • 12時以降なら何も表示されない

比較演算子の完全ガイド

数値比較演算子

演算子意味読み方
-eq等しい$a -eq 5equal
-ne等しくない$a -ne 5not equal
-gtより大きい$a -gt 5greater than
-ltより小さい$a -lt 5less than
-ge以上$a -ge 5greater equal
-le以下$a -le 5less equal

文字列比較演算子

演算子意味特徴
-eq文字列が等しい$name -eq "Alice"大文字小文字を区別しない
-ceq文字列が等しい(厳密)$name -ceq "Alice"大文字小文字を区別する
-likeパターンマッチ$name -like "*ice"ワイルドカード使用可
-match正規表現マッチ$email -match "@.*\.com$"正規表現使用可

実例:様々な比較

# 数値比較
$score = 85
if ($score -ge 80) {
    Write-Host "合格です!"
}

# 文字列比較(大文字小文字無視)
$username = "admin"
if ($username -eq "ADMIN") {
    Write-Host "管理者ログイン"  # これは実行される
}

# 厳密な文字列比較(大文字小文字区別)
if ($username -ceq "ADMIN") {
    Write-Host "厳密一致"  # これは実行されない
}

# パターンマッチング
$filename = "report_2024.xlsx"
if ($filename -like "*.xlsx") {
    Write-Host "Excelファイルです"
}

# 正規表現マッチング
$email = "user@example.com"
if ($email -match "^[^@]+@[^@]+\.[^@]+$") {
    Write-Host "有効なメールアドレス形式です"
}

else と elseif:複雑な条件分岐

if-else 構文

if (条件) {
    # 条件がTrueの場合の処理
} else {
    # 条件がFalseの場合の処理
}

実例:

$age = 17

if ($age -ge 18) {
    Write-Host "成人です"
} else {
    Write-Host "未成年です"
}

if-elseif-else 構文

$score = 75

if ($score -ge 90) {
    Write-Host "優秀:A評価"
} elseif ($score -ge 80) {
    Write-Host "良好:B評価"
} elseif ($score -ge 70) {
    Write-Host "普通:C評価"
} elseif ($score -ge 60) {
    Write-Host "合格:D評価"
} else {
    Write-Host "不合格:F評価"
}

実用例:システム管理

# ディスク容量チェック
$drive = Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='C:'"
$freeSpaceGB = [math]::Round($drive.FreeSpace / 1GB, 2)

if ($freeSpaceGB -lt 5) {
    Write-Host "警告:ディスク容量が5GB未満です ($freeSpaceGB GB)" -ForegroundColor Red
} elseif ($freeSpaceGB -lt 10) {
    Write-Host "注意:ディスク容量が10GB未満です ($freeSpaceGB GB)" -ForegroundColor Yellow
} else {
    Write-Host "ディスク容量:正常 ($freeSpaceGB GB)" -ForegroundColor Green
}

ファイル・フォルダの存在確認

Test-Path コマンドレット

基本構文:

Test-Path "パス"

戻り値:

  • $True:存在する
  • $False:存在しない

実用例

例1:ファイル存在確認

$filePath = "C:\temp\data.txt"

if (Test-Path $filePath) {
    Write-Host "ファイルが存在します"
    # ファイルの内容を読み込む
    $content = Get-Content $filePath
    Write-Host "ファイル内容:$content"
} else {
    Write-Host "ファイルが見つかりません"
    # 新しいファイルを作成する
    "初期データ" | Out-File $filePath
    Write-Host "新しいファイルを作成しました"
}

例2:フォルダ存在確認

$backupFolder = "C:\Backup"

if (Test-Path $backupFolder) {
    Write-Host "バックアップフォルダが存在します"
} else {
    Write-Host "バックアップフォルダを作成します"
    New-Item -ItemType Directory -Path $backupFolder
    Write-Host "バックアップフォルダを作成しました"
}

例3:複数パスの確認

$paths = @("C:\temp", "C:\logs", "C:\backup")

foreach ($path in $paths) {
    if (Test-Path $path) {
        Write-Host "$path : 存在します" -ForegroundColor Green
    } else {
        Write-Host "$path : 存在しません" -ForegroundColor Red
        # 必要に応じてフォルダを作成
        New-Item -ItemType Directory -Path $path -Force
        Write-Host "$path : フォルダを作成しました" -ForegroundColor Yellow
    }
}

論理演算子で複雑な条件を作る

論理演算子の種類

演算子意味使用例
-andかつ(AND)($a -gt 5) -and ($b -lt 10)
-orまたは(OR)($a -eq 1) -or ($a -eq 2)
-not否定(NOT)-not (Test-Path $file)
!否定(NOTの短縮形)!(Test-Path $file)

実例:複雑な条件

例1:複数条件の組み合わせ

$age = 25
$hasLicense = $true
$hasInsurance = $true

if (($age -ge 18) -and $hasLicense -and $hasInsurance) {
    Write-Host "運転可能です"
} else {
    Write-Host "運転条件を満たしていません"
    
    if ($age -lt 18) {
        Write-Host "- 年齢が18歳未満です"
    }
    if (-not $hasLicense) {
        Write-Host "- 運転免許証がありません"
    }
    if (-not $hasInsurance) {
        Write-Host "- 保険に加入していません"
    }
}

例2:ファイル処理の条件

$sourceFile = "C:\data\source.txt"
$destinationFolder = "C:\backup"

if ((Test-Path $sourceFile) -and (Test-Path $destinationFolder)) {
    # ファイルをバックアップ
    Copy-Item $sourceFile $destinationFolder
    Write-Host "バックアップが完了しました"
} elseif (-not (Test-Path $sourceFile)) {
    Write-Host "エラー:ソースファイルが存在しません"
} elseif (-not (Test-Path $destinationFolder)) {
    Write-Host "エラー:バックアップフォルダが存在しません"
}

変数とデータ型

PowerShellの変数

変数の特徴:

  • $で始まる
  • 動的型付け(自動で型が決まる)
  • 大文字小文字を区別しない
$number = 42          # 数値
$text = "Hello"       # 文字列
$flag = $true         # 真偽値
$items = @(1,2,3)     # 配列

データ型の確認

$value = 100
Write-Host "値:$value"
Write-Host "型:$($value.GetType().Name)"

# 出力:
# 値:100
# 型:Int32

型変換とif文

$input = "123"  # 文字列として格納

# 文字列として比較
if ($input -eq "123") {
    Write-Host "文字列として一致"
}

# 数値に変換して比較
$number = [int]$input
if ($number -eq 123) {
    Write-Host "数値として一致"
}

# 直接変換して比較
if ([int]$input -gt 100) {
    Write-Host "100より大きい数値"
}

実用的なif文の活用例

例1:システム監視スクリプト

# CPU使用率チェック
$cpu = Get-WmiObject win32_processor | Measure-Object -property LoadPercentage -Average
$cpuUsage = $cpu.Average

if ($cpuUsage -gt 80) {
    Write-Host "警告:CPU使用率が高すぎます ($cpuUsage%)" -ForegroundColor Red
    # 必要に応じてアラートメール送信など
} elseif ($cpuUsage -gt 60) {
    Write-Host "注意:CPU使用率がやや高めです ($cpuUsage%)" -ForegroundColor Yellow
} else {
    Write-Host "CPU使用率:正常 ($cpuUsage%)" -ForegroundColor Green
}

# メモリ使用量チェック
$memory = Get-WmiObject -Class Win32_OperatingSystem
$memUsage = [math]::Round((($memory.TotalVisibleMemorySize - $memory.FreePhysicalMemory) / $memory.TotalVisibleMemorySize) * 100, 2)

if ($memUsage -gt 85) {
    Write-Host "警告:メモリ使用率が高すぎます ($memUsage%)" -ForegroundColor Red
} else {
    Write-Host "メモリ使用率:正常 ($memUsage%)" -ForegroundColor Green
}

例2:ファイル整理スクリプト

$sourceFolder = "C:\Downloads"
$archiveFolder = "C:\Archive"

# アーカイブフォルダの存在確認
if (-not (Test-Path $archiveFolder)) {
    New-Item -ItemType Directory -Path $archiveFolder
    Write-Host "アーカイブフォルダを作成しました"
}

# ファイルの整理
Get-ChildItem $sourceFolder | ForEach-Object {
    $file = $_
    $extension = $file.Extension.ToLower()
    
    # ファイル種別による分類
    if ($extension -eq ".pdf") {
        $targetFolder = "$archiveFolder\PDF"
    } elseif ($extension -in @(".jpg", ".png", ".gif")) {
        $targetFolder = "$archiveFolder\Images"
    } elseif ($extension -in @(".mp4", ".avi", ".mkv")) {
        $targetFolder = "$archiveFolder\Videos"
    } else {
        $targetFolder = "$archiveFolder\Others"
    }
    
    # ターゲットフォルダの作成
    if (-not (Test-Path $targetFolder)) {
        New-Item -ItemType Directory -Path $targetFolder -Force
    }
    
    # ファイルの移動
    Move-Item $file.FullName $targetFolder
    Write-Host "$($file.Name) を $targetFolder に移動しました"
}

例3:バックアップスクリプト

$sourceFolder = "C:\Important"
$backupFolder = "D:\Backup\$(Get-Date -Format 'yyyy-MM-dd')"

# ソースフォルダの存在確認
if (-not (Test-Path $sourceFolder)) {
    Write-Host "エラー:バックアップ対象フォルダが存在しません" -ForegroundColor Red
    exit
}

# バックアップ先の空き容量確認
$drive = Get-WmiObject -Class Win32_LogicalDisk -Filter "DeviceID='D:'"
$freeSpaceGB = [math]::Round($drive.FreeSpace / 1GB, 2)

if ($freeSpaceGB -lt 10) {
    Write-Host "エラー:バックアップ先の空き容量が不足しています ($freeSpaceGB GB)" -ForegroundColor Red
    exit
}

# バックアップフォルダの作成
if (-not (Test-Path $backupFolder)) {
    New-Item -ItemType Directory -Path $backupFolder -Force
    Write-Host "バックアップフォルダを作成しました:$backupFolder"
}

# バックアップ実行
try {
    Copy-Item $sourceFolder $backupFolder -Recurse -Force
    Write-Host "バックアップが完了しました" -ForegroundColor Green
} catch {
    Write-Host "エラー:バックアップに失敗しました - $($_.Exception.Message)" -ForegroundColor Red
}

よくあるエラーと対処法

エラー1:構文エラー

間違い:括弧の忘れ

# ❌ 間違い
if $number -gt 5 {
    Write-Host "大きい"
}

正解:

# ✅ 正しい
if ($number -gt 5) {
    Write-Host "大きい"
}

エラー2:文字列比較の間違い

間違い:クォートの忘れ

# ❌ 間違い
$name = "Alice"
if ($name -eq Alice) {  # Aliceが変数として扱われる
    Write-Host "一致"
}

正解:

# ✅ 正しい
$name = "Alice"
if ($name -eq "Alice") {  # 文字列として比較
    Write-Host "一致"
}

エラー3:論理演算子の間違い

間違い:C言語風の演算子

# ❌ 間違い
if ($a > 5 && $b < 10) {
    Write-Host "条件一致"
}

正解:

# ✅ 正しい
if (($a -gt 5) -and ($b -lt 10)) {
    Write-Host "条件一致"
}

エラー4:$null の扱い

問題のあるコード:

$result = Get-Process "NotExistProcess" -ErrorAction SilentlyContinue

# $resultがnullの場合、予期しない動作
if ($result.Name -eq "test") {
    Write-Host "見つかりました"
}

改善されたコード:

$result = Get-Process "NotExistProcess" -ErrorAction SilentlyContinue

# まずnullチェック
if ($null -ne $result) {
    if ($result.Name -eq "test") {
        Write-Host "見つかりました"
    }
} else {
    Write-Host "プロセスが見つかりません"
}

デバッグとトラブルシューティング

デバッグのコツ

1. 変数の値を確認

$value = 10
Write-Host "デバッグ:value = $value"  # 変数の中身を確認

if ($value -gt 5) {
    Write-Host "条件:True"
} else {
    Write-Host "条件:False"
}

2. 複雑な条件を分割

# 複雑な条件を分割して確認
$condition1 = ($age -ge 18)
$condition2 = ($hasLicense -eq $true)
$condition3 = (Test-Path $file)

Write-Host "年齢条件:$condition1"
Write-Host "免許条件:$condition2"
Write-Host "ファイル条件:$condition3"

if ($condition1 -and $condition2 -and $condition3) {
    Write-Host "すべての条件を満たしています"
}

3. エラー処理の追加

try {
    $result = Get-WmiObject Win32_Process -ErrorAction Stop
    
    if ($result.Count -gt 50) {
        Write-Host "プロセス数が多すぎます"
    }
} catch {
    Write-Host "エラーが発生しました:$($_.Exception.Message)"
}

よくある質問と回答

Q: PowerShellのif文とバッチファイルのif文の違いは?

A: 構文と機能が大きく異なります

項目バッチファイルPowerShell
構文if %var%==valueif ($var -eq "value")
演算子限定的豊富(-eq, -gt, -like など)
データ型文字列のみ数値、文字列、配列、オブジェクト
エラー処理基本的高度(try-catch)

Q: if文の中でコマンドを実行できますか?

A: はい、可能です

# コマンドの実行結果で条件分岐
if (Get-Process "notepad" -ErrorAction SilentlyContinue) {
    Write-Host "メモ帳が起動しています"
    Stop-Process -Name "notepad"
} else {
    Write-Host "メモ帳は起動していません"
    Start-Process "notepad"
}

Q: 複数の値と比較するには?

A: -in演算子や配列を使用します

$extension = ".pdf"

# 複数の値との比較
if ($extension -in @(".pdf", ".doc", ".docx")) {
    Write-Host "ドキュメントファイルです"
}

# または配列の Contains メソッド
$allowedExtensions = @(".jpg", ".png", ".gif")
if ($allowedExtensions -contains $extension) {
    Write-Host "画像ファイルです"
}

Q: if文をワンライナーで書けますか?

A: はい、セミコロンで区切って書けます

# 通常の書き方
if (Test-Path $file) { Write-Host "存在します" } else { Write-Host "存在しません" }

# 三項演算子風(PowerShell 7以降)
$message = (Test-Path $file) ? "存在します" : "存在しません"
Write-Host $message

応用テクニック

Switch文との使い分け

多数の条件分岐がある場合はSwitchが便利:

# if文の場合(冗長)
if ($status -eq "running") {
    Write-Host "実行中"
} elseif ($status -eq "stopped") {
    Write-Host "停止中"
} elseif ($status -eq "paused") {
    Write-Host "一時停止"
} else {
    Write-Host "不明"
}

# Switch文の場合(すっきり)
switch ($status) {
    "running" { Write-Host "実行中" }
    "stopped" { Write-Host "停止中" }
    "paused"  { Write-Host "一時停止" }
    default   { Write-Host "不明" }
}

Where-Objectとの組み合わせ

# プロセス一覧から条件に合うものを抽出
$processes = Get-Process | Where-Object { $_.CPU -gt 100 }

if ($processes.Count -gt 0) {
    Write-Host "CPU使用量の高いプロセスが見つかりました:"
    $processes | ForEach-Object {
        Write-Host "- $($_.Name): $($_.CPU)"
    }
} else {
    Write-Host "CPU使用量の高いプロセスはありません"
}

まとめ:PowerShellのif文を使いこなせば、スクリプトがもっと柔軟に!

今回学んだ重要なポイント:

機能構文例用途
基本if文if ($x -eq 1) { }単純な条件分岐
if-elseif () { } else { }二択の処理
if-elseif-else複数の条件分岐多段階の判定
ファイル確認if (Test-Path "パス")ファイル・フォルダ存在確認
論理演算子-and, -or, -not複雑な条件の組み合わせ

実際に使ってみよう:

  1. 基本的な数値・文字列比較から始める
  2. ファイル存在確認で実用的なスクリプトを作成
  3. 論理演算子で複雑な条件を表現
  4. エラー処理を組み合わせて堅牢なスクリプトを作成

PowerShellのif文の利点:

  • 豊富な比較演算子で柔軟な条件設定
  • オブジェクト指向でのデータ処理が可能
  • エラー処理との組み合わせで安全なスクリプト作成
  • システム管理に最適化された機能

コメント

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