是否有PowerShell等效的命令:
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
还是说如何设置强制所有字符串转换符遵循一个与机器配置无关的文化?
是否有PowerShell等效的命令:
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
还是说如何设置强制所有字符串转换符遵循一个与机器配置无关的文化?
$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
}
}
Set-Culture
。由于Set-Culture
设置用户的区域设置,因此您需要打开另一个PowerShell实例才能从中受益。它也不会改变正在运行的PowerShell实例的区域设置。当然,您可以在当前实例中启动新的PowerShell实例。这并不完全符合要求,但非常相关。
如果他们将其移植回Win7和Server 2008或将其作为PowerShell本身的功能,则会很方便。Get-Culture
(显示en-US),然后运行Set-Culture de-DE
,再次运行Get-Culture
仍然显示en-US,并且date
格式与平常一样。但是当您打开另一个PowerShell并运行Get-Culture
时,它会显示de-DE,date
格式就像德国人一样。 - mbx本回答涉及当前文化,确定日期格式、货币、数字格式、排序顺序等设置;相比之下,当前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实例(线程)的区域设置。
[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 - 请参阅文档。
请查看此处以获取ObjectCmdletBase.Culture
属性的详细信息。
获取和设置派生 cmdlet 的 Culture 参数的值。
Set-Culture
在本地服务器上可以运行,但在远程计算机上运行时无法工作。
Invoke-Command -ComputerName $server -ScriptBlock{
#Requires -RunAsAdministrator
Set-Culture -CultureInfo en-GB;
Set-TimeZone -Id "GMT Standard Time"
}
[threading.thread]::CurrentThread.ManagedThreadId
。 - Keith Hill