【问题标题】:How to set culture in PowerShell?如何在 PowerShell 中设置文化?
【发布时间】:2010-11-05 10:56:22
【问题描述】:

是否有任何 PowerShell 等效项:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

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

【问题讨论】:

    标签: .net powershell internationalization


    【解决方案1】:

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

    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】:

      我认为这会奏效:

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

      这个想法来自:

      Link

      【讨论】:

      • 它不扔给我,但文化并没有这样改变。
      • @Roman 我发现了该声明的问题并更正了它。在 C# 中它可以工作。
      • 是的。至少对我来说。文化不会以这种方式在全球范围内发生变化。
      • @Roman 我已经预料到了。它在 C# 中的行为方式相同。它单独为当前线程设置文化。
      • 是的,在控制台[threading.thread]::CurrentThread.ManagedThreadId运行几次。
      【解决方案3】:

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

      如果他们将其移植回 Win7 和 Server 2008 或使其成为 powershell 本身的功能,那就太好了。

      【讨论】:

      • 链接文档显示“为当前用户帐户设置用户文化”。 - 所以它似乎不只是为当前进程设置这个,而是全局设置。
      • @SebastianKrysmanski 这种行为实际上有点奇怪。它按照承诺改变了用户的文化,但您的 powershell 实例保持其文化:打开一个 powershell,Get-Culture(给出 en-US),然后 Set-Culture de-DE,使用 Get-Culture 再次给出 en-US 和一个 @987654327 @ 格式照常。但是,当您打开另一个 powershell 并 Get-Culture 它会提供 de-DE、date 格式,就像德国人会做的那样。
      【解决方案4】:

      这个答案处理当前文化,它决定了诸如日期格式、货币、数字格式、整理顺序等设置;相比之下,当前的 UI 文化决定了 UI 语言(菜单、错误消息等);下面讨论的所有元素都有 UI 文化类似物(例如,Get-UICulture 与 Get-Culture、$PSUICulture 与 $PSCulture 除了Set-Culture,没有类似物。

      转变为不同的文化:

      在 .NET Framework v4.6 及更高版本中,您现在可以分配到[cultureinfo]::CurrentCulture(以前,它被读取- only[1];[cultureinfo] PS 类型的加速器是在 PSv3 中引入的);例如:

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

      等效于(也适用于 v4.5 或更低版本,至少在 v2 中有效):

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

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

      • 这两种方法更改当前 PowerShell 实例(线程)的区域性仅。

        • Caveat [在 PowerShell Core 中至少从 v6.0.2 开始修复]:如前所述,为了在 interactive PowerShell 中尝试此操作session,在 single 行输入所有命令,因为文化改变效果仅限于单个命令行(这仍然适用于 PSv3+,即使那里的控制台默认以 STA 模式运行);例如,打印德国日期:
          [cultureinfo]::CurrentCulture = 'de-DE'; Get-Date # must be on same line
      • 对于当前用户的持久文化变化,请使用 Set-Culture cmdlet,但是,如 @987654323 中所述@,此更改仅对 未来 PowerShell 实例生效,而不是当前实例。


      查询文化设置:

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

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


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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 由于我对 PowerShell 一无所知,您能否提供一个简单的 sn-p,我可以在此处的每个脚本的第一行添加它,以便根据 InvariantCulture 进行相应的字符串化?
        • 其实这里有更好的方法,举例:blogs.msdn.com/b/powershell/archive/2006/04/25/583235.aspx
        【解决方案6】:

        Set-Culture 可以在本地服务器上运行,但在远程计算机上运行时它不起作用

        Invoke-Command -ComputerName $server -ScriptBlock{
                    #Requires -RunAsAdministrator
                    Set-Culture -CultureInfo en-GB; 
                    Set-TimeZone -Id "GMT Standard Time" 
                }
        

        【讨论】:

        • 这是在远程服务器中发生的情况:{Get-UICulture - ui 文化不变},{Get-Culture - 当前文化变化}。但是,当您在没有脚本块的本地计算机上运行 set-culture 时,它​​可以正常工作。 set-culture 也会改变 ui 文化。
        猜你喜欢
        • 2017-05-18
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多