PowerShellでエスケープシーケンスが効かない?色が変わらない原因と解決策

Windows

PowerShellでANSIエスケープシーケンスを使って色を変えたいのに、全く反映されない……」そ
んな経験はありませんか?

実は、これは設定や使用環境によるもので、少しの工夫で簡単に解決できます。

この記事では、Windows PowerShellで色が変わらない原因と、その具体的な対処法をわかりやすく解説します。

エスケープシーケンスとは

エスケープシーケンスとは、文字に色をつけたり、文字を太くしたりするための特別なコードです。

プログラマーがよく使う技術で、ターミナルやコンソールの表示をきれいにしてくれます。

例えば、こんなことができます:

  • 文字を赤色で表示する
  • 背景色を青色にする
  • 文字を太字にする
  • 文字を点滅させる

それでは、なぜPowerShellで色が変わらないのか、原因を探ってみましょう。

スポンサーリンク

よくある原因

原因1:PowerShellのバージョンが古い

PowerShell 5.1以前では、ANSIエスケープシーケンスが標準でサポートされていないことがあります。

解決策PowerShell 7以降を使用すると、対応状況が大幅に改善されます。

バージョンの確認方法

$PSVersionTable.PSVersion

実行例

Major  Minor  Patch  PreReleaseLabel BuildRevision
-----  -----  -----  --------------- -------------
7      4      0                      

この場合、PowerShell 7.4.0が使われているので問題ありません。

新しいPowerShellのインストール

もしバージョンが古い場合は、以下から最新版をダウンロードできます:

  • Microsoft Storeで「PowerShell」を検索
  • GitHubの公式ページからダウンロード

原因2:Windowsコンソールがレガシーモード

古いコンソールでは、ANSIシーケンスが無視されてしまいます。

解決策:PowerShellのプロパティから「レガシ コンソールを使用する」のチェックを外しましょう。

設定変更の手順

  1. PowerShellのウィンドウのタイトルバーを右クリック
  2. 「プロパティ」を選択
  3. 「オプション」タブを開く
  4. 「レガシ コンソールを使用する」のチェックを外す
  5. 「OK」をクリック

原因3:使用している端末が非対応

cmd.exeや古いPowerShellウィンドウでは、表示が制限されることがあります。

解決策Windows Terminalの使用がおすすめです。

Windows Terminalのメリット

  • 最新のエスケープシーケンスに完全対応
  • 美しいフォントとカラー表示
  • タブ機能で複数のコンソールを管理
  • カスタマイズ性が高い

インストール方法:Microsoft Storeで「Windows Terminal」を検索してインストール

確認すべき設定

PowerShellのバージョン確認(再掲)

$PSVersionTable.PSVersion

重要PowerShell 7.0以上であることを確認してください。

コンソールモードの確認と変更

手順1:プロパティを開く

  1. PowerShellのウィンドウで右クリック
  2. **「プロパティ」**を選択

手順2:レガシーモードを無効にする

  1. **「オプション」**タブを開く
  2. **「レガシ コンソールを使用する」**にチェックが入っていないか確認
  3. チェックが入っている場合は外す

レジストリ設定の確認(上級者向け)

注意:レジストリ操作は慎重に行ってください。間違えるとシステムに影響が出る可能性があります。

確認場所

HKEY_CURRENT_USER\Console
VirtualTerminalLevel = 1

設定方法

  1. Windowsキー + Rを押して「regedit」と入力
  2. HKEY_CURRENT_USER\Consoleを開く
  3. VirtualTerminalLevelを探す
  4. 存在しないか、値が0なら、新規作成または修正します

新規作成の場合

  • 右クリック → 新規DWORD(32ビット)値
  • 名前を「VirtualTerminalLevel」にする
  • 値を「1」に設定

正しい使い方の例

基本的なエスケープシーケンス

# 赤い文字を表示
Write-Host "`e[31m赤い文字です`e[0m"

# 青い文字を表示
Write-Host "`e[34m青い文字です`e[0m"

# 緑の背景で黄色い文字
Write-Host "`e[42m`e[33m緑背景で黄色い文字`e[0m"

色の番号リスト

文字色

  • 30:黒
  • 31:赤
  • 32:緑
  • 33:黄
  • 34:青
  • 35:マゼンタ
  • 36:シアン
  • 37:白

背景色

  • 40:黒背景
  • 41:赤背景
  • 42:緑背景
  • 43:黄背景
  • 44:青背景
  • 45:マゼンタ背景
  • 46:シアン背景
  • 47:白背景

実用的な例

# エラーメッセージを赤で表示
Write-Host "`e[31m[エラー]`e[0m ファイルが見つかりません"

# 成功メッセージを緑で表示
Write-Host "`e[32m[成功]`e[0m 処理が完了しました"

# 警告メッセージを黄色で表示
Write-Host "`e[33m[警告]`e[0m この操作は取り消せません"

# 情報メッセージを青で表示
Write-Host "`e[34m[情報]`e[0m 処理を開始します"

関数として使いやすくする

function Write-ColorText {
    param(
        [string]$Text,
        [string]$Color = "white"
    )
    
    $colorCodes = @{
        "black" = "30"
        "red" = "31"
        "green" = "32"
        "yellow" = "33"
        "blue" = "34"
        "magenta" = "35"
        "cyan" = "36"
        "white" = "37"
    }
    
    $colorCode = $colorCodes[$Color]
    Write-Host "`e[${colorCode}m$Text`e[0m"
}

# 使用例
Write-ColorText "これは赤い文字です" "red"
Write-ColorText "これは青い文字です" "blue"

トラブル解決チェックリスト

ステップバイステップで確認

ステップ1:基本環境の確認

  • [ ] PowerShellのバージョンが7.0以上か確認
  • [ ] Windows Terminalを使用しているか確認
  • [ ] レガシーモードが無効になっているか確認

ステップ2:簡単なテストを実行

# テスト用のコード
Write-Host "`e[31mこの文字が赤く表示されるはずです`e[0m"

このコードを実行して、文字が赤く表示されるかチェックしてください。

ステップ3:詳細設定の確認(必要に応じて)

  • [ ] レジストリのVirtualTerminalLevelが1に設定されているか確認
  • [ ] ターミナルエミュレータが最新版か確認

よくある問題と解決方法

問題1:文字が表示されるが色が変わらない

原因:レガシーモードが有効になっている 解決策:プロパティから「レガシ コンソールを使用する」のチェックを外す

問題2:エスケープシーケンスがそのまま表示される

原因:PowerShellのバージョンが古い 解決策:PowerShell 7以降にアップデート

問題3:一部の色だけ表示されない

原因:ターミナルの色設定が限定されている 解決策:Windows Terminalに変更するか、設定を確認

対応状況の確認表

チェック項目対応方法重要度
PowerShellのバージョン7.0以上か確認⭐⭐⭐
ターミナルの種類Windows Terminal推奨⭐⭐⭐
レガシーモード無効に設定⭐⭐
レジストリ設定VirtualTerminalLevelを1に設定

実用的な活用例

ログ出力をきれいにする

function Write-Log {
    param(
        [string]$Message,
        [string]$Level = "INFO"
    )
    
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    
    switch ($Level) {
        "ERROR" { 
            Write-Host "`e[31m[$timestamp] [ERROR] $Message`e[0m" 
        }
        "WARN" { 
            Write-Host "`e[33m[$timestamp] [WARN]  $Message`e[0m" 
        }
        "INFO" { 
            Write-Host "`e[34m[$timestamp] [INFO]  $Message`e[0m" 
        }
        "SUCCESS" { 
            Write-Host "`e[32m[$timestamp] [SUCCESS] $Message`e[0m" 
        }
    }
}

# 使用例
Write-Log "処理を開始します" "INFO"
Write-Log "ファイルを処理中..." "INFO"
Write-Log "警告:一部のファイルをスキップしました" "WARN"
Write-Log "エラー:接続に失敗しました" "ERROR"
Write-Log "すべての処理が完了しました" "SUCCESS"

プログレスバーの作成

function Show-Progress {
    param(
        [int]$Current,
        [int]$Total,
        [string]$Activity = "処理中"
    )
    
    $percent = [int](($Current / $Total) * 100)
    $progressBar = "█" * [int]($percent / 5)
    $spaces = " " * (20 - [int]($percent / 5))
    
    Write-Host -NoNewline "`r`e[36m$Activity`e[0m [`e[32m$progressBar`e[0m$spaces] $percent%"
    
    if ($Current -eq $Total) {
        Write-Host ""
        Write-Host "`e[32m完了しました!`e[0m"
    }
}

# 使用例
for ($i = 1; $i -le 100; $i++) {
    Show-Progress -Current $i -Total 100 -Activity "ファイル処理"
    Start-Sleep -Milliseconds 50
}

まとめ

PowerShellで色が変わらない場合、多くは設定や使用環境に原因があります。

解決のポイント

  • PowerShell 7以降の使用
  • Windows Terminalの導入
  • レガシーモードの解除
  • 適切なエスケープシーケンスの記述

これらを確認することで、問題は解決可能です。

この記事の要点

  • バージョン確認が最も重要
  • Windows Terminalが最も確実
  • エスケープシーケンス\e[数字mの形式で記述
  • 関数化することで再利用しやすくなる

コメント

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