如何在PowerShell中设置文化?

时间:2010-11-05 10:56:22

标签: .net powershell internationalization

是否有任何PowerShell等效于:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

?或者如何设置强制所有stringfications独立于机器配置服从文化?

6 个答案:

答案 0 :(得分:5)

我认为这会奏效:

$currentThread = [System.Threading.Thread]::CurrentThread
$culture = [System.Globalization.CultureInfo]::InvariantCulture
$currentThread.CurrentCulture = $culture
$currentThread.CurrentUICulture = $culture

这个想法来自:

http://blogs.msdn.com/b/powershell/archive/2006/04/25/583235.aspx

答案 1 :(得分:5)

这是我用于测试其他文化中的字符串/格式的函数:

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    
    }
}

答案 2 :(得分:5)

对于WinServer2012和Win8,您可以使用Set-Culture。当Set-Culture为您的用户设置文化时,您必须打开另一个PowerShell实例才能从中受益。它也不会改变运行ps实例的文化。当然,您可以在当前实例中启动新的PowerShell实例。 这不是所要求的,而是密切相关的。

如果将它们移植回Win7和Server 2008或将其作为powershell itselft的一个功能,它会很简洁。

答案 3 :(得分:1)

有关ObjectCmdletBase.Culture属性的详细信息,请参阅here

  

获取并设置Culture的值   派生cmdlet的参数。

答案 4 :(得分:1)

此答案涉及当前文化,它确定日期格式,货币,数字格式,整理顺序等设置。相比之下,当前的UI文化决定了UI语言(菜单,错误消息......);下面讨论的所有元素都有UI文化类比(例如,Get-UICultureGet-Culture$PSUICulture$PSCultureSet-Culture之外,没有模拟

更改为其他文化

.NET Framework v4.6 及更高版本中,您现在可以分配给[cultureinfo]::CurrentCulture (之前,它是只读 [1] ; [cultureinfo] PS型加速器在PSv3中引入; e.g:

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

相当于(也适用于v4.5或更低版本,至少为v2):

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

CAVEAT :PowerShell使用与字符串相关的上下文中的不变文化,,无论当前的文化是什么 - 见我的this answer

  • 两种方法仅更改当前 PowerShell实例(主题)的文化

    • 警告 [至少在v6.0.2中修复了PowerShell Core ]:正如已经指出的那样,为了在交互式中尝试这个 PowerShell会话,在行上输入所有命令,因为文化改变效果仅限于单个命令行(这仍然适用于PSv3 +,即使默认情况下在STA模式下运行的控制台也是如此);例如,打印德国日期:
      [cultureinfo]::CurrentCulture = 'de-DE'; Get-Date # must be on same line
  • 对于当前用户的持续文化更改,请使用 Set-Culture cmdlet ,但是,如上所述mbx's helpful answer,此更改仅对 future PowerShell实例生效,而不是当前实例。

查询文化设置:

  • [cultureinfo]::CurrentCulture [System.Threading.Thread]::CurrentThread.CurrentCulture反映当前 PowerShell实例的 有效文化

  • 相比之下, Get-Culture cmdlet (PSv3 +)和自动 $PSCulture 变量(PSv3 +;只读)总是反映出来当前PowerShell实例在启动时的文化;即,它们始终反映当前用户在当前PowerShell实例启动时持久配置的文化(无论是仅通过[cultureinfo]::CurrentCulture = ... future 持久性的实例更改通过Set-Culture在该实例中执行的更改。

[1]见docs;要确定您是否至少安装了v4.6,请在Version:的输出中查找Get-Item 'registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'值。
请注意,框架版本与$PSVersionTable.CLRVersion报告的 CLR (运行时)版本不同;例如,v4.6 框架基于v4.0 CLR - 请参阅docs

答案 5 :(得分:0)

Set-Culture可在本地服务器上运行,但在远程计算机上运行时则不起作用 Invoke-Command -ComputerName $server -ScriptBlock{ #Requires -RunAsAdministrator Set-Culture -CultureInfo en-GB; Set-TimeZone -Id "GMT Standard Time" }