.net 如何在PowerShell中设置区域性?

.net 如何在PowerShell中设置区域性?,.net,powershell,internationalization,.net,Powershell,Internationalization,以下方面是否有与PowerShell等效的功能: Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; ??或者如何设置强制所有字符串独立于计算机配置遵守区域性?有关ObjectCmdletBase.culture属性的详细信息,请参阅 获取并设置区域性的值 派生cmdlet的参数 我认为这会奏效: $currentThread = [System.Threading.Thread]::CurrentThread

以下方面是否有与PowerShell等效的功能:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
??或者如何设置强制所有字符串独立于计算机配置遵守区域性?

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

获取并设置区域性的值 派生cmdlet的参数


我认为这会奏效:

$currentThread = [System.Threading.Thread]::CurrentThread
$culture = [System.Globalization.CultureInfo]::InvariantCulture
$currentThread.CurrentCulture = $culture
$currentThread.CurrentUICulture = $culture
这个想法来自:


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

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

对于WinServer2012和Win8,您可以使用。当
Set Culture
为用户设置区域性时,您必须打开另一个powershell实例才能从中获益。此外,它不会更改运行ps实例的区域性。当然,您可以在当前实例中启动一个新的powershell实例。这并不完全是人们所要求的,而是密切相关的

如果他们将其移植回Win7和Server 2008,或者将其作为powershell自身的一项功能,这将是一个不错的选择。

这个答案涉及当前区域性,它决定了诸如日期格式、货币、数字格式、排序顺序等设置。。。;相比之下,当前的UI区域性决定了UI语言(菜单、错误消息等);下面讨论的所有元素都具有UI区域性类似物(例如,
Get-UICulture
Get-culture
$PSCulture
$PSCulture
,除了
设置区域性
,没有类似物

改变到不同的文化环境

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

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

警告:PowerShell在与字符串相关的上下文中使用不变的区域性,而不管当前的区域性是什么-请参阅我的

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

    • 警告[至少从v6.0.2开始在PowerShell Core中修复]:如前所述,为了在交互式PowerShell会话中尝试此操作,请在一行中输入所有命令,因为区域性更改效果仅限于一个命令行(这仍然适用于PSv3+,尽管那里的控制台默认运行在STA模式下);例如,打印德国日期:
      [cultureinfo]:CurrentCulture='de de';Get Date#必须在同一行上
  • 对于当前用户的持续区域性更改,请使用,但如中所述,此更改仅对将来的PowerShell实例生效,而不是对当前实例生效


查询区域性设置:

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

  • 相比之下,(PSv3+)和自动
    $PSCulture
    变量(PSv3+;只读)始终在启动时反映当前PowerShell实例的区域性;也就是说,它们始终反映当前用户在当前PowerShell实例启动时持续配置的区域性(无论通过
    [cultureinfo]仅更改实例)::CurrentCulture=…
    或通过在该实例中执行的
    设置区域性的未来持久性更改)


[1] 请参阅;要确定是否至少安装了v4.6,请在“注册表::HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full”的输出中查找
版本:


请注意,框架版本不同于
$PSVersionTable.CLRVersion
报告的CLR(运行时)版本;例如,v4.6框架基于v4.0 CLR-请参阅。

设置区域性
在本地服务器上工作,但在远程计算机上运行时不工作

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

由于我对PowerShell一无所知,您能提供一个简单的片段,我可以在这里的每个脚本的第一行通过它,这样它将根据不变量文化进行字符串化吗?实际上这里有一个更好的方法,并举例说明:它不为我抛出,但文化不会以这种方式更改。@Roman我发现了与e语句,我更正了它。在C#中,它会起作用。是的。至少对我来说。区域性不会以这种方式全局更改。@Roman我已经预料到了。它在C#中的行为与此相同。它单独为当前线程设置区域性。是的,请在控制台
[threading.thread]上运行几次::CurrentThread.ManagedThreadId
。链接的文档显示“为当前用户帐户设置用户区域性”-因此,似乎它不仅为当前进程设置了此区域性,而且还全局设置了此区域性。@SebastianKrysmanski该行为实际上有点奇怪。它按照承诺更改了用户的区域性,但您的powershell实例保留了其区域性:打开powershell,
获取区域性
(向我们提供),然后
设置区域性de
,使用
Get Culture
再次向我们提供en和一个
date
格式。但当您打开另一个powershell并
Get Culture
时,它会提供de,
date
格式,就像德国人会做的那样。这就是远程服务器中发生的情况:{Get-UICulture-ui-Culture不改变},{Get Culture-current Culture changes}。但是,在本地计算机上运行set Culture而不使用scriptblock时,它可以正常工作。set Culture也会更改ui区域性。
[System.Threading.Thread]::CurrentThread.CurrentCulture = 'de-DE'
Invoke-Command -ComputerName $server -ScriptBlock{
            #Requires -RunAsAdministrator
            Set-Culture -CultureInfo en-GB; 
            Set-TimeZone -Id "GMT Standard Time" 
        }