WindowsとPowerShellのlocale確認は短い一行でも扱えますが、入力の種類や版を確認しないまま本番へ使うと誤判定を招きます。この記事の結論は「Get-Cultureだけでsystemの全localeを表せません。current culture、UI culture、Windows system locale、home location、user language listを分けて読み、scriptではculture依存の文字列parseを避けます。」。format用culture、UI language、system locale、user language listを別々に取得する場合を対象に、確認結果から次の行動を選べる形で解説します。
session cultureとUI cultureを別々に読む
locale調査は対象userとhostを確定し、culture関連値を個別に取得します。Get-Culture、Get-UICulture、Get-WinSystemLocaleがshell builtin、cmdlet、外部programのどれかも確認し、別実装のoptionを混在させません。
- $PSCultureと$PSUICultureを確認する
- Get-CultureとGet-UICultureを比較する
- Get-WinSystemLocaleとGet-WinUserLanguageListを読む
- timezone、encoding、region formatをlocaleと混同しない
system localeをnon-Unicode設定として確認する
PowerShell session culture
Get-Culture | Select-Object Name,LCID,DisplayName,DateTimeFormat,NumberFormat
Get-UICulture | Select-Object Name,LCID,DisplayName
formatとUI resourceのcultureは異なる場合があります。
Windows system locale
Get-WinSystemLocale | Select-Object Name,LCID,DisplayName
non-Unicode program向けsystem localeで、current user display languageとは別です。
user language list
Get-WinUserLanguageList | Select-Object LanguageTag,Autonym,EnglishName,InputMethodTips,Spellchecking
複数languageとinput methodを確認します。
地域とtimezoneを分ける
Get-WinHomeLocation
Get-TimeZone | Select-Object Id,DisplayName,BaseUtcOffset
region、culture、timezoneは独立設定です。
cultureを明示したparse
$culture=[Globalization.CultureInfo]::GetCultureInfo('ja-JP')
[datetime]::ParseExact('2026/07/17','yyyy/MM/dd',$culture)
外部dataのformat仕様を固定し、端末既定cultureに依存しません。
user language listと入力方式を記録する
- Get-Cultureをsystem全体のlocaleとする
- localeとtimezoneを混同する
- display nameをlogicへ使う
- implicit date/number parseに依存する
- language list変更を無影響と考える
region・timezone・cultureを混同しない
LCIDはculture識別子で地域codeだけではありません。Get-Cultureはprocess/sessionのcurrent cultureを返し、起動方法や一時変更でOS設定と異なる場合があります。Get-WinSystemLocaleはsystem-wide、Get-WinUserLanguageListはuserごとです。曜日名やdecimal separatorをlogicへ直接使わず、invariantなdata形式を採用します。
parseには期待cultureとformatを明示する
読取commandは変更しません。Set-Culture、Set-WinSystemLocale、Set-WinUserLanguageListはapplication表示、legacy encoding、入力methodに影響し、sign-out/restartが必要な場合があります。変更前の全設定をexportし、test userでapplication互換性を確認し、失敗時は元culture/language listへ戻します。業務端末へ一括変更しません。
設定変更をせず差分だけ収集する
SettingsのLanguage & region、PowerShell各cmdlet、applicationのdate/decimal表示を照合します。current userとsystem scopeを作業記録で分け、別session再起動後も同じ値か確認します。変更なし調査ではlanguage listが前後で同じです。
decimal・date・offsetをsampleで検収する
Get-Cultureはsession/userのformat、Get-WinSystemLocaleはnon-Unicode program向けsystem locale、Get-WinUserLanguageListは表示/入力言語、Get-TimeZoneは時刻規則です。四つを別fieldで記録し、日付文字列のparseには明示cultureを渡します。
culture・system locale・timezoneを一行にまとめる
$c=Get-Culture
$sys=Get-WinSystemLocale
$tz=Get-TimeZone
[pscustomobject]@{Culture=$c.Name;LCID=$c.LCID;Decimal=$c.NumberFormat.NumberDecimalSeparator;SystemLocale=$sys.Name;TimeZoneId=$tz.Id;UtcOffset=$tz.GetUtcOffset((Get-Date))}
locale仕様差を取得不能と混同しない
- locale情報を取得:各APIからName/LCID/LanguageTag/TimeZone Idを取得し、対象sessionの値として記録できる
- 想定cultureと相違:設定項目が空/非適用でも他のlocaleと補完せずUnknownにする
- International module error:cmdlet不在、policy、remote session差、parse errorは個別のErrorとして扱う
地域(HomeLocation)とtimezoneを同じ設定としません。CSV decimal separatorや日/月順を表示から推測せず、InvariantCultureまたは契約cultureを明示します。確認だけでuser language listを変更しません。
07/08/2026をja-JPとen-USで比較する
$ja=[Globalization.CultureInfo]::GetCultureInfo('ja-JP')
$us=[Globalization.CultureInfo]::GetCultureInfo('en-US')
'07/08/2026' | ForEach-Object { [pscustomobject]@{Text=$_;Ja=[datetime]::Parse($_,$ja);Us=[datetime]::Parse($_,$us)} }
ja-JP/en-US、decimal comma、DST有無、remote session、ambiguous dateをtestします。culture名、LCID、separator、timezone ID/offset、parse後ISO値を保存します。
Culture、SystemLocale、HomeLocation、TimeZoneは別設定です。曖昧な日付文字列をCurrentCultureへ任せず、source仕様のcultureとformatをParseExactへ渡します。

コメント