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-scheme
とDark Reader、アプリケーションならAuto Dark Modeで対処できる中、ここだけ手動が必要なのはけっこう不便。
これを使わずとも公式で機能として使えるようにしてほしい。