0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Powershellの配色をテーマに応じて自動で切り替える

Last updated at Posted at 2024-10-08

PS本体の「アプリケーションのテーマ」だけじゃなく、ライト/ダークモードに応じて「規定の配色」を特定のものに自動で切り替えたい。
設定でどうにかするのは無理そうだったので起動時スクリプトを作って対処。

settings.jsonを直接書き換えます。
予めバックアックを取っておいて下さい。

環境

  • Windows 11
  • PowerShell 7.4.5

準備

  • PowerShellを起動し設定 (Ctrl+,) を開く
  • [配色]を開く
  • 新規追加
    • ライトテーマ用の配色スキームを作り、「配色の名前を変更する」から LightMode にして保存
    • ダークテーマ用も同様にして DarkMode を作成

スクリプト本体

エラーアクションを設定

$ErrorActionPreference = "Stop"

変数のパスを定義

# レジストリ
$registryPath = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize"

#Powershellの設定ファイル (settings.json)
$settingsFilePath = "$env:LOCALAPPDATA\packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"
  • AppsUseLightTheme が存在しない」的なエラーが出た場合これを参考に作成
  • ここでは AppsUseLightTheme を使ってるけど多分 SystemUseLightTheme でも良い?
  • [設定>個人用設定>色>モードを選ぶ] がライトまたはダークの想定
    • カスタムになって弄られてると切り替え時にバグるかも

テーマの確認・変更

Try-Catchでエラーハンドリング

try {
    # {テーマの確認・変更}
} catch {
    Write-Error "An error occurred: $_"
}

$theme$colorScheme を定義

# レジストリから現在のシステムテーマを取得
$theme = Get-ItemProperty -Path $registryPath -Name "AppsUseLightTheme" -ErrorAction Stop

# 現在のシステムテーマに応じて $colorSheme を定義
$colorScheme = if ($theme.AppsUseLightTheme -eq 1) { "LightMode" } else { "DarkMode" }

settings.json を確認・読み込んでパース・$settings に定義

if (-not (Test-Path $settingsFilePath)) {
    throw "Settings file not found at $settingsFilePath"
}
$settings = Get-Content -Path $settingsFilePath -Raw | ConvertFrom-Json

colorScheme を確認・システムテーマと異なるなら切り替え

if (-not $settings.profiles) {
    throw "profiles not found in settings file."
}
if (-not $settings.profiles.defaults) {
    throw "defaults not found in profiles."
}
if (-not $settings.profiles.defaults.PSObject.Properties.Name -contains "colorScheme") {
    throw "colorScheme not found in defaults."
}
if ($settings.profiles.defaults.colorScheme -ne $colorScheme) {
    $settings.profiles.defaults.colorScheme = $colorScheme
        $jsonSettings = $settings | ConvertTo-Json -Depth 10
        [System.IO.File]::WriteAllText($settingsFilePath, $jsonSettings)
        <# Write-Host "Color scheme updated to $colorScheme"
    } else {
        Write-Host "Color scheme is already set to $colorScheme"
    #>}
} catch {
    Write-Error "An error occurred: $_"
}
  • profiles.defaults.colorScheme を変更してjson丸ごと書き換え。Depth は実際には5もあれば足りるはず
  • コメントアウト部分をアンコメントするとPowershell起動時にコンソール出力を返す
    • 配色が切り替わったときだけ出力がほしい場合一行目だけ残す

エラーアクションをデフォルトに戻す

$ErrorActionPreference = "Continue"

起動時スクリプトとして設定

notepad $PROFILE

でプロファイルを開く。 ( vim でも code でもなんでも)

「みつかりません」と表示されたら
New-Item -path $profile -type file -force

でプロファイルを新規に作成し、再度開く。


メモ帳が立ち上がるので

スクリプト全体
$ErrorActionPreference = "Stop"
$settingsFilePath = "$env:LOCALAPPDATA\packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"
$registryPath = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize"
try {
    $theme = Get-ItemProperty -Path $registryPath -Name "AppsUseLightTheme" -ErrorAction Stop
    $colorScheme = if ($theme.AppsUseLightTheme -eq 1) { "LightMode" } else { "DarkMode" }
    if (-not (Test-Path $settingsFilePath)) {
        throw "Settings file not found at $settingsFilePath"
    }
    $settings = Get-Content -Path $settingsFilePath -Raw | ConvertFrom-Json
    if (-not $settings.profiles) {
        throw "profiles not found in settings file."
    }
    if (-not $settings.profiles.defaults) {
        throw "defaults not found in profiles."
    }
    if (-not $settings.profiles.defaults.PSObject.Properties.Name -contains "colorScheme") {
        throw "colorScheme not found in defaults."
    }
    if ($settings.profiles.defaults.colorScheme -ne $colorScheme) {
        $settings.profiles.defaults.colorScheme = $colorScheme
        $jsonSettings = $settings | ConvertTo-Json -Depth 10
        [System.IO.File]::WriteAllText($settingsFilePath, $jsonSettings)
    }
} catch {
    Write-Error "An error occurred: $_"
}

をペースト。


プロファイルを既に色々弄っててごちゃついてる場合 \Documents\Powershell\Scripts\AutoThemeChange.ps1 なりで保存して呼び出す方がいいかもしれない

後記

webページならCSSの prefers-color-schemeDark Reader、アプリケーションならAuto Dark Modeで対処できる中、ここだけ手動が必要なのはけっこう不便。
これを使わずとも公式で機能として使えるようにしてほしい。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?