Dot-Net

如何在 PowerShell 中設置文化?

  • December 6, 2021

是否有任何 PowerShell 等效項:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

? 或者如何設置強制所有字元串化以獨立於機器配置服從文化?

這是我用於在其他文化中測試字元串/格式的功能:

function Using-Culture (
 [System.Globalization.CultureInfo]
 $culture = (throw "USAGE: Using-Culture -Culture culture -Script {...}"),
 [ScriptBlock]
 $script = (throw "USAGE: Using-Culture -Culture culture -Script {...}"))
{
   $OldCulture = [Threading.Thread]::CurrentThread.CurrentCulture
   $OldUICulture = [Threading.Thread]::CurrentThread.CurrentUICulture    
   try {        
       [Threading.Thread]::CurrentThread.CurrentCulture = $culture        
       [Threading.Thread]::CurrentThread.CurrentUICulture = $culture        
       Invoke-Command $script    
   }    
   finally {        
       [Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture        
       [Threading.Thread]::CurrentThread.CurrentUICulture = $OldUICulture    
   }
}

這個答案處理目前文化,它決定了諸如日期格式、貨幣、數字格式、整理順序等設置;相比之下,目前的 UI 文化決定了 UI 語言(菜單、錯誤消息……);下面討論的所有元素都有 UI 文化類似物(例如,Get-UICulturevs. Get-Culture$PSUICulturevs. $PSCultureEXCEPT Set-Culture,沒有類似物。

改變到不同的文化

在**.NET Framework v4.6**及更高版本中,您現在可以分配[cultureinfo]::CurrentCulture(以前,它是只讀的$$ 1 $$; [cultureinfo]PSv3中引入了PS型加速器);例如:

[cultureinfo]::CurrentCulture = 'de-DE'

相當於(也適用於 v4.5 或更低版本,至少低至 v2):

[System.Threading.Thread]::CurrentThread.CurrentCulture = 'de-DE'

CAVEAT:PowerShell在與字元串相關的上下文中使用不變的文化,無論目前的文化是什麼- 請參閱我的這個答案

  • 這兩種方法僅更改目前PowerShell 實例(執行緒)區域性。

    • 警告[至少在 PowerShell Core v6.0.2 中已修復]:如前所述,為了在互動式PowerShell 會話中嘗試此操作,請在一行中輸入所有命令,因為文化改變效果僅限於單個命令行(這仍然適用於 PSv3+,即使那裡的控制台預設以 STA 模式執行);例如,列印一個德國日期:

    [cultureinfo]::CurrentCulture = 'de-DE'; Get-Date # must be on same line

  • 對於目前使用者的持久文化更改,請使用**Set-Culturecmdlet**,但是,正如mbx 的有用答案中所述,此更改僅對未來的 PowerShell 實例生效,而不是目前實例。


查詢文化設置:

  • [cultureinfo]::CurrentCulture[System.Threading.Thread]::CurrentThread.CurrentCulture反映目前PowerShell 實例的有效*文化*。
  • 相比之下,Get-Culturecmdlet (PSv3+) 和自動**$PSCulture變數 (PSv3+;只讀) 在啟動時總是反映目前 PowerShell 實例的文化;即,它們始終反映目前使用者在啟動目前 PowerShell 實例時的持久配置區域性**(無論通過在該實例中執行的僅實例更改[cultureinfo]::CurrentCulture = ...未來持久更改)。Set-Culture

$$ 1 $$請參閱文件;要確定您是否至少安裝了 v4.6,請Version:在輸出中查找Get-Item 'registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'.

請注意,框架版本不同於;報告的CLR(執行時)版本。$PSVersionTable.CLRVersion例如,v4.6框架基於 v4.0 CLR - 請參閱文件

引用自:https://stackoverflow.com/questions/4105224