更改Powershell会话的当前文化,v3.0 +特定

时间:2015-06-19 11:27:48

标签: powershell powershell-v3.0 culture powershell-v4.0

我想在当前的交互式Powershell会话中更改已接受数据和错误的文化。我在SuperUser上了解了这个问题powershell : changing the culture of current session和问题Changing current culture。它不能与Powershell 3.0和4.0一起使用的主要问题。

PS C:\users\me\Documents> [system.threading.thread]::currentthread.currentculture

LCID             Name             DisplayName
----             ----             -----------
1049             ru-RU            Русский (Россия)


PS C:\users\me\Documents> [system.threading.thread]::currentthread.currentculture=[system.globalization.cultureinfo]"en-US"
PS C:\users\me\Documents> [system.threading.thread]::currentthread.currentculture

LCID             Name             DisplayName
----             ----             -----------
1049             ru-RU            Русский (Россия)

UI文化也不接受新设置。总共Set-Culture无效,无论我是否使用管理员权限 - 无论如何,它不应受此影响,因为效果仅适用于单个流程。来自SO社区的MSDN Powershell博客的Using-Culture可以工作,但只是部分地,例如,当前的文化" ru-RU"我可以在" 6/19/15 2:26:02 PM"字符串,位于" en-US"通过Using-Culture "en-US" {get-date -date "6/19/15 2:26:02 PM"}进行文化,但是无法接收其他语言的错误:说Using-Culture "en-US" {$null.test='1'}会导致俄语区域设置出错,就好像文化没有改变一样。

此行为在安装了Powershell 4.0的本地Win7 Professional工作站上进行了测试,并安装了安装了Powershell 3.0的Windows Server 2012,这需要解析错误的本地化日期字符串。后者拥有" en-US"和系统区域设置" ru-RU"。

所以,PS3及以上版本仍然可以改变Powershell会话的文化,如果是的话,怎么样? (或者它是否会再次出现错误,或者我不知道PS3的变化?)

1 个答案:

答案 0 :(得分:1)

更改文化仅影响线程,仅适用于该过程。 您的PS窗口是在当前语言环境下启动的,因此该线程具有该语言环境。在当前系统区域设置下启动的PS窗口中键入“[System.Threading.Thread] :: CurrentThread.CurrentCulture”将始终显示该区域设置。

如果你在ISE中运行它,它应该解释一下:

 function Set-Culture([System.Globalization.CultureInfo] $culture) {
[System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture
[System.Threading.Thread]::CurrentThread.CurrentCulture = $culture }

Set-Culture en-US
[system.threading.thread]::currentthread.currentculture
Pause

或者,在PS窗口中:

function Set-Culture([System.Globalization.CultureInfo] $culture) { [System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture ; [System.Threading.Thread]::CurrentThread.CurrentCulture = $culture } ; Set-Culture en-US ; [system.threading.thread]::currentthread.currentculture

工作正常。

如果您想要一个具有新文化的PS窗口,您需要使用该文化启动它,而不是尝试在之后进行更改。