【发布时间】:2010-11-05 10:56:22
【问题描述】:
是否有任何 PowerShell 等效项:
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
?或者如何设置强制所有字符串化以独立于机器配置服从文化?
【问题讨论】:
标签: .net powershell internationalization
是否有任何 PowerShell 等效项:
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
?或者如何设置强制所有字符串化以独立于机器配置服从文化?
【问题讨论】:
标签: .net powershell internationalization
这是我用于测试其他文化中的字符串/格式的函数:
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
}
}
【讨论】:
我认为这会奏效:
$currentThread = [System.Threading.Thread]::CurrentThread
$culture = [System.Globalization.CultureInfo]::InvariantCulture
$currentThread.CurrentCulture = $culture
$currentThread.CurrentUICulture = $culture
这个想法来自:
【讨论】:
[threading.thread]::CurrentThread.ManagedThreadId运行几次。
对于 WinServer2012 和 Win8,您可以使用Set-Culture。由于 Set-Culture 为您的用户设置文化,您必须打开另一个 powershell 实例才能从中受益。它也不会改变运行 ps 实例的文化。当然,您可以在当前实例中启动一个新的 powershell 实例。 这并不完全是我们所要求的,而是密切相关的。
如果他们将其移植回 Win7 和 Server 2008 或使其成为 powershell 本身的功能,那就太好了。
【讨论】:
Get-Culture(给出 en-US),然后 Set-Culture de-DE,使用 Get-Culture 再次给出 en-US 和一个 @987654327 @ 格式照常。但是,当您打开另一个 powershell 并 Get-Culture 它会提供 de-DE、date 格式,就像德国人会做的那样。
这个答案处理当前文化,它决定了诸如日期格式、货币、数字格式、整理顺序等设置;相比之下,当前的 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 实例(线程)的区域性仅。
[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。
【讨论】:
有关ObjectCmdletBase.Culture 属性的详细信息,请参阅here。
获取和设置 Culture 的值 派生 cmdlet 的参数。
【讨论】:
Set-Culture 可以在本地服务器上运行,但在远程计算机上运行时它不起作用
Invoke-Command -ComputerName $server -ScriptBlock{
#Requires -RunAsAdministrator
Set-Culture -CultureInfo en-GB;
Set-TimeZone -Id "GMT Standard Time"
}
【讨论】: