如何在PowerShell中设置文化?

13

是否有PowerShell等效的命令:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

还是说如何设置强制所有字符串转换符遵循一个与机器配置无关的文化?

6个回答

7
我认为这会起作用:
$currentThread = [System.Threading.Thread]::CurrentThread
$culture = [System.Globalization.CultureInfo]::InvariantCulture
$currentThread.CurrentCulture = $culture
$currentThread.CurrentUICulture = $culture

这个想法来自于:

链接


1
它对我来说没有抛出异常,但这种方式并不会改变文化。 - Roman Kuzmin
@Roman 我找到了语句的问题并进行了更正。在C#中它会工作。 - Jader Dias
1
是的。对我来说至少是这样。文化并非以此方式在全球范围内改变。 - Roman Kuzmin
1
@Roman 我已经预料到了。它在 C# 中的行为方式相同。它只为当前线程设置区域设置。 - Jader Dias
2
在控制台上运行几次 [threading.thread]::CurrentThread.ManagedThreadId - Keith Hill
显示剩余6条评论

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

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

5
对于WinServer2012和Win8,您可以使用Set-Culture。由于Set-Culture设置用户的区域设置,因此您需要打开另一个PowerShell实例才能从中受益。它也不会改变正在运行的PowerShell实例的区域设置。当然,您可以在当前实例中启动新的PowerShell实例。这并不完全符合要求,但非常相关。 如果他们将其移植回Win7和Server 2008或将其作为PowerShell本身的功能,则会很方便。

链接的文档中写道:“为当前用户帐户设置用户区域设置。” - 因此,它似乎不仅在当前进程中设置,而且在全局范围内设置。 - Sebastian Krysmanski
1
@SebastianKrysmanski 实际上这种行为有点奇怪。它确实像承诺的那样更改了用户的文化,但您的PowerShell实例保持其文化:打开一个PowerShell,运行Get-Culture(显示en-US),然后运行Set-Culture de-DE,再次运行Get-Culture仍然显示en-US,并且date格式与平常一样。但是当您打开另一个PowerShell并运行Get-Culture时,它会显示de-DE,date格式就像德国人一样。 - mbx

3

本回答涉及当前文化,确定日期格式、货币、数字格式、排序顺序等设置;相比之下,当前UI文化决定了UI语言(菜单、错误消息等);下面讨论的所有元素都有UI文化模拟(例如,Get-UICulture vs. Get-Culture$PSUICulture vs. $PSCulture),除了Set-Culture,没有类似物。

更改到不同的文化:

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

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

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

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

注意:PowerShell在与字符串相关的上下文中使用不变的区域设置,无论当前区域设置为何 - 参见我的这个答案

  • 两种方法仅更改当前PowerShell实例(线程)区域设置

    • 注意事项 [在PowerShell Core至少v6.0.2中已修复]:如先前所述,在交互式PowerShell会话中尝试此操作时,请在单个命令行上输入所有命令,因为更改区域设置的效果仅限于单个命令行(即使控制台在PSv3+中默认运行在STA模式下也仍然适用);例如,要打印德国日期:
      [cultureinfo]::CurrentCulture = 'de-DE'; Get-Date # 必须在同一行上
  • 对于当前用户的持久性区域设置更改,请使用Set-Culture cmdlet,但是,正如mbx的有用答案中所述,此更改仅对未来的PowerShell实例生效,而不是当前实例。


查询区域设置:

  • [cultureinfo]::CurrentCulture[System.Threading.Thread]::CurrentThread.CurrentCulture反映了当前PowerShell实例的有效区域设置

  • 相比之下,Get-Culture cmdlet(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'
请注意,框架版本与由 $PSVersionTable.CLRVersion 报告的 CLR(运行时)版本不同;例如,v4.6 框架 基于 v4.0 CLR - 请参阅文档


1

请查看此处以获取ObjectCmdletBase.Culture属性的详细信息。

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


由于我对PowerShell一无所知,你能提供一个简单的片段吗?这样我就可以将其粘贴到我这里每个脚本的第一行,以便它按InvariantCulture进行字符串化。 - Jader Dias
实际上这里有一种更好的方法,带有示例:http://blogs.msdn.com/b/powershell/archive/2006/04/25/583235.aspx - Steve Townsend

1

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文化。 - Ignore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接