Windows PowerShellでANSIエスケープシーケンスを活用する方法:カラー出力とスタイル装飾の基本ガイド

Windows

PowerShellでプログラムを作ったり、コマンドを実行したりしているとき、こんなことを思ったことはありませんか?

「エラーメッセージを赤色で表示したい」
「重要な情報は太字で強調したい」
「成功したときは緑色で『OK』って出したい」

実は、PowerShellではANSIエスケープシーケンスという機能を使って、文字に色を付けたり、太字にしたり、下線を引いたりすることができるんです!

この記事では、PowerShellをもっと見やすく、わかりやすくする方法を、プログラミング初心者の方にもわかりやすく解説します。

スポンサーリンク

ANSIエスケープシーケンスって何?

「文字の見た目を変える魔法の呪文」

ANSIエスケープシーケンスとは、ターミナル(コマンドライン画面)で文字の見た目を変えるための特別なコードです。

何ができるの?

  • 文字の色を変える:赤、青、緑など好きな色に
  • 背景色を変える:文字の後ろの色を変更
  • 文字を太くする:重要な部分を太字で強調
  • 下線を引く:リンクのように下線を表示
  • 点滅させる:注意を引きたい文字を点滅(一部のターミナル)

どんな場面で使うの?

実用的な使い方の例

  • エラーメッセージ:赤色で表示して目立たせる
  • 成功メッセージ:緑色で安心感を与える
  • 警告メッセージ:黄色で注意を促す
  • 重要な情報:太字で強調する
  • ログの種類分け:情報レベルごとに色を変える

PowerShellのバージョンによる違い

新しいPowerShellと古いPowerShell

PowerShellには大きく分けて2つのバージョンがあります。

Windows PowerShell(古いバージョン)

  • バージョン:5.1以前
  • 特徴:Windowsに最初から入っている
  • ANSIサポート:限定的(あまり使えない)

PowerShell(新しいバージョン)

  • バージョン:7.0以降
  • 特徴:Microsoft公式サイトからダウンロード
  • ANSIサポート:完全対応(なんでもできる!)

自分のPowerShellバージョンを確認する方法

# バージョンを確認するコマンド
$PSVersionTable.PSVersion

結果の見方

  • 5.1以前:Windows PowerShell(機能限定)
  • 7.0以降:PowerShell Core(フル機能)

PowerShell 7をインストールするには?

新しいPowerShellを使いたい場合は、Microsoft公式サイトからダウンロードできます。

古いバージョンと共存できるので、安心してインストールできます。

インストール方法

  1. Microsoft PowerShell公式サイトにアクセス
  2. 最新版をダウンロード
  3. インストーラーを実行
  4. 「PowerShell」という新しいアプリが追加される

$PSStyleを使った基本的な装飾

$PSStyleって何?

PowerShell 7以降では、$PSStyleという便利な変数が用意されています。

これを使うと、複雑なANSIコードを覚えなくても、簡単に文字を装飾できます。

$PSStyleの構成

  • $PSStyle.Foreground:文字の色
  • $PSStyle.Background:背景の色
  • $PSStyle.Bold:太字
  • $PSStyle.Underline:下線
  • $PSStyle.Reset:装飾をリセット(元に戻す)

基本的な使い方

文字を赤色にする

Write-Host "$($PSStyle.Foreground.Red)これは赤い文字です$($PSStyle.Reset)"

文字を太字にする

Write-Host "$($PSStyle.Bold)これは太字です$($PSStyle.Reset)"

下線を引く

Write-Host "$($PSStyle.Underline)これは下線付きです$($PSStyle.Reset)"

複数の装飾を組み合わせる

Write-Host "$($PSStyle.Bold)$($PSStyle.Foreground.Red)$($PSStyle.Underline)重要な警告メッセージ$($PSStyle.Reset)"

なぜ最後に$PSStyle.Resetが必要?

装飾は一度設定すると、その後の文字にも適用され続けます。$PSStyle.Resetを使って装飾をリセットしないと、その後の出力も同じスタイルになってしまいます。

悪い例(Resetなし)

Write-Host "$($PSStyle.Foreground.Red)エラーメッセージ"
Write-Host "この文字も赤くなってしまう"  # 意図しない結果

良い例(Resetあり)

Write-Host "$($PSStyle.Foreground.Red)エラーメッセージ$($PSStyle.Reset)"
Write-Host "この文字は通常の色"  # 期待通りの結果

色の種類と使い分け

基本的な色

PowerShellで使える基本的な色は以下の通りです。

文字色(Foreground)

# 基本色
Write-Host "$($PSStyle.Foreground.Black)黒$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.Red)赤$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.Green)緑$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.Yellow)黄$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.Blue)青$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.Magenta)マゼンタ$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.Cyan)シアン$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.White)白$($PSStyle.Reset)"

# 明るい色
Write-Host "$($PSStyle.Foreground.BrightBlack)明るい黒$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.BrightRed)明るい赤$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.BrightGreen)明るい緑$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.BrightYellow)明るい黄$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.BrightBlue)明るい青$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.BrightMagenta)明るいマゼンタ$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.BrightCyan)明るいシアン$($PSStyle.Reset)"
Write-Host "$($PSStyle.Foreground.BrightWhite)明るい白$($PSStyle.Reset)"

背景色(Background)

# 背景色の例
Write-Host "$($PSStyle.Background.Red)$($PSStyle.Foreground.White)赤い背景に白い文字$($PSStyle.Reset)"
Write-Host "$($PSStyle.Background.Green)$($PSStyle.Foreground.Black)緑の背景に黒い文字$($PSStyle.Reset)"
Write-Host "$($PSStyle.Background.Blue)$($PSStyle.Foreground.Yellow)青い背景に黄色い文字$($PSStyle.Reset)"

色の使い分けガイド

エラーメッセージ

Write-Host "$($PSStyle.Foreground.Red)❌ エラー: ファイルが見つかりません$($PSStyle.Reset)"

成功メッセージ

Write-Host "$($PSStyle.Foreground.Green)✅ 成功: ファイルのコピーが完了しました$($PSStyle.Reset)"

警告メッセージ

Write-Host "$($PSStyle.Foreground.Yellow)⚠️  警告: ディスク容量が不足しています$($PSStyle.Reset)"

情報メッセージ

Write-Host "$($PSStyle.Foreground.Cyan)ℹ️  情報: 処理を開始します$($PSStyle.Reset)"

カスタムカラーの作成

RGB値で自由な色を作る

PowerShell 7では、RGB(赤・緑・青)の値を指定して、オリジナルの色を作ることができます。

基本的な使い方

# RGB値で色を指定(各色0-255の範囲)
$customRed = $PSStyle.Foreground.FromRgb(255, 100, 100)  # 明るいピンク
$customGreen = $PSStyle.Foreground.FromRgb(100, 255, 100)  # 明るい緑
$customBlue = $PSStyle.Foreground.FromRgb(100, 100, 255)  # 明るい青

Write-Host "${customRed}カスタムピンク$($PSStyle.Reset)"
Write-Host "${customGreen}カスタムグリーン$($PSStyle.Reset)"
Write-Host "${customBlue}カスタムブルー$($PSStyle.Reset)"

背景色のカスタマイズ

# カスタム背景色
$bgOrange = $PSStyle.Background.FromRgb(255, 165, 0)  # オレンジ色の背景
Write-Host "$bgOrange$($PSStyle.Foreground.Black)オレンジ背景の文字$($PSStyle.Reset)"

16進数カラーコードの使用

Webデザインでよく使われる16進数カラーコード(#FF0000など)も使えます。

# 16進数カラーコードを使用
function ConvertTo-RgbFromHex {
    param([string]$HexColor)
    
    $hex = $HexColor -replace '#', ''
    $r = [Convert]::ToInt32($hex.Substring(0,2), 16)
    $g = [Convert]::ToInt32($hex.Substring(2,2), 16)
    $b = [Convert]::ToInt32($hex.Substring(4,2), 16)
    
    return $PSStyle.Foreground.FromRgb($r, $g, $b)
}

# 使用例
$webBlue = ConvertTo-RgbFromHex "#007acc"
Write-Host "${webBlue}Webスタイルの青色$($PSStyle.Reset)"

実用的なスクリプト例

ログレベル別の出力関数

# ログレベル別の出力関数を定義
function Write-Info {
    param([string]$Message)
    Write-Host "$($PSStyle.Foreground.Cyan)[INFO]$($PSStyle.Reset) $Message"
}

function Write-Warning {
    param([string]$Message)
    Write-Host "$($PSStyle.Foreground.Yellow)[WARNING]$($PSStyle.Reset) $Message"
}

function Write-Error {
    param([string]$Message)
    Write-Host "$($PSStyle.Foreground.Red)[ERROR]$($PSStyle.Reset) $Message"
}

function Write-Success {
    param([string]$Message)
    Write-Host "$($PSStyle.Foreground.Green)[SUCCESS]$($PSStyle.Reset) $Message"
}

# 使用例
Write-Info "処理を開始します"
Write-Warning "設定ファイルが見つかりません。デフォルト値を使用します"
Write-Error "接続に失敗しました"
Write-Success "すべての処理が完了しました"

プログレスバーもどき

function Show-Progress {
    param(
        [int]$Current,
        [int]$Total,
        [int]$Width = 50
    )
    
    $percentage = [math]::Floor(($Current / $Total) * 100)
    $completed = [math]::Floor(($Current / $Total) * $Width)
    $remaining = $Width - $completed
    
    $progressBar = "$($PSStyle.Background.Green)" + (" " * $completed) + "$($PSStyle.Reset)" + 
                   "$($PSStyle.Background.BrightBlack)" + (" " * $remaining) + "$($PSStyle.Reset)"
    
    Write-Host "`r[$progressBar] $percentage%" -NoNewline
}

# 使用例
for ($i = 0; $i -le 100; $i += 10) {
    Show-Progress -Current $i -Total 100
    Start-Sleep -Milliseconds 200
}
Write-Host ""  # 改行

ファイル処理結果の表示

function Process-Files {
    param([string[]]$FilePaths)
    
    Write-Host "$($PSStyle.Bold)ファイル処理結果:$($PSStyle.Reset)"
    Write-Host ""
    
    foreach ($file in $FilePaths) {
        if (Test-Path $file) {
            $size = (Get-Item $file).Length
            Write-Host "  $($PSStyle.Foreground.Green)✓$($PSStyle.Reset) " -NoNewline
            Write-Host "$file " -NoNewline
            Write-Host "$($PSStyle.Foreground.BrightBlack)($size bytes)$($PSStyle.Reset)"
        } else {
            Write-Host "  $($PSStyle.Foreground.Red)✗$($PSStyle.Reset) " -NoNewline
            Write-Host "$file " -NoNewline
            Write-Host "$($PSStyle.Foreground.Red)(ファイルが見つかりません)$($PSStyle.Reset)"
        }
    }
}

# 使用例
$files = @("C:\Windows\System32\notepad.exe", "C:\存在しないファイル.txt", "C:\Windows\System32\calc.exe")
Process-Files -FilePaths $files

環境による違いと対応方法

ターミナルアプリによる違い

Windows Terminal(推奨)

  • ANSIエスケープシーケンスを完全サポート
  • 美しいフォントと色の表示
  • 透明度やアニメーション効果も可能

従来のコンソール(cmd.exe)

  • 基本的な色変更のみサポート
  • 一部の装飾が正しく表示されない場合
  • Windows 10 バージョン1903以降で改善

Visual Studio Code統合ターミナル

  • ANSIエスケープシーケンスをサポート
  • エディタのテーマに合わせた色表示

互換性を確保する方法

# ANSIサポートの確認
function Test-AnsiSupport {
    return ($PSVersionTable.PSVersion.Major -ge 7) -and 
           ($Host.UI.SupportsVirtualTerminal -eq $true)
}

# 安全な色付き出力関数
function Write-ColorText {
    param(
        [string]$Text,
        [string]$Color = "White"
    )
    
    if (Test-AnsiSupport) {
        # ANSIサポートがある場合
        switch ($Color) {
            "Red"    { Write-Host "$($PSStyle.Foreground.Red)$Text$($PSStyle.Reset)" }
            "Green"  { Write-Host "$($PSStyle.Foreground.Green)$Text$($PSStyle.Reset)" }
            "Yellow" { Write-Host "$($PSStyle.Foreground.Yellow)$Text$($PSStyle.Reset)" }
            default  { Write-Host $Text }
        }
    } else {
        # ANSIサポートがない場合は通常の出力
        Write-Host $Text
    }
}

出力のリダイレクトと制御

ファイル出力時の注意点

PowerShellでファイルに出力をリダイレクトするとき、ANSIエスケープシーケンスも一緒に保存されてしまうことがあります。

問題のある例

Write-Host "$($PSStyle.Foreground.Red)エラーメッセージ$($PSStyle.Reset)" > error.log
# ファイルにANSIコードも保存されてしまう

解決方法1:プレーンテキスト出力に設定

# 一時的にプレーンテキスト出力に変更
$originalRendering = $PSStyle.OutputRendering
$PSStyle.OutputRendering = 'PlainText'

Write-Host "$($PSStyle.Foreground.Red)エラーメッセージ$($PSStyle.Reset)" > error.log

# 元の設定に戻す
$PSStyle.OutputRendering = $originalRendering

解決方法2:Write-Outputを使用

# Write-Hostの代わりにWrite-Outputを使用
Write-Output "エラーメッセージ" > error.log

ログファイル用の関数

function Write-Log {
    param(
        [string]$Message,
        [string]$Level = "INFO",
        [string]$LogFile = $null
    )
    
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logMessage = "[$timestamp] [$Level] $Message"
    
    # 画面表示(色付き)
    switch ($Level) {
        "ERROR"   { Write-Host "$($PSStyle.Foreground.Red)$logMessage$($PSStyle.Reset)" }
        "WARNING" { Write-Host "$($PSStyle.Foreground.Yellow)$logMessage$($PSStyle.Reset)" }
        "SUCCESS" { Write-Host "$($PSStyle.Foreground.Green)$logMessage$($PSStyle.Reset)" }
        default   { Write-Host "$($PSStyle.Foreground.Cyan)$logMessage$($PSStyle.Reset)" }
    }
    
    # ファイル出力(色なし)
    if ($LogFile) {
        Add-Content -Path $LogFile -Value $logMessage
    }
}

# 使用例
Write-Log -Message "アプリケーションを開始しました" -Level "INFO" -LogFile "app.log"
Write-Log -Message "設定ファイルが見つかりません" -Level "WARNING" -LogFile "app.log"
Write-Log -Message "データベース接続エラー" -Level "ERROR" -LogFile "app.log"

トラブルシューティング

よくある問題と解決法

問題1:文字化けや表示がおかしい

# 文字エンコーディングを確認
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

問題2:色が表示されない

# バージョンとサポート状況を確認
Write-Host "PowerShell Version: $($PSVersionTable.PSVersion)"
Write-Host "Virtual Terminal Support: $($Host.UI.SupportsVirtualTerminal)"

# Windows Terminalを使用することを推奨

問題3:スクリプト実行後に色がリセットされない

# スクリプトの最後で必ずリセット
trap {
    Write-Host $PSStyle.Reset
}

# または、スクリプト終了時の処理を追加
Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {
    Write-Host $PSStyle.Reset
}

まとめ:PowerShellをもっと使いやすく

ANSIエスケープシーケンスを使ったPowerShellの装飾、いかがでしたか?

今日学んだポイント

  • ANSIエスケープシーケンスで文字に色や装飾を付けられる
  • PowerShell 7以降なら$PSStyleで簡単に使える
  • 色の使い分けでメッセージの種類を区別できる
  • RGB値でオリジナルの色も作れる
  • ファイル出力時は注意が必要

実際に使ってみよう

  • エラーメッセージは赤色で
  • 成功メッセージは緑色で
  • 重要な情報は太字で
  • 警告は黄色で目立たせる

環境を整えよう

  • PowerShell 7以降にアップグレード
  • Windows Terminalを使用
  • 適切な文字エンコーディングを設定

注意すること

  • 必ず$PSStyle.Resetで装飾をリセット
  • ファイル出力時は色コードに注意
  • 環境によるサポート状況の違いを理解

コメント

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