Change the current culture of a Powershell session

2020-06-21 04:26发布

问题:

I want to change the culture of accepted data and errors in my current interactive Powershell session. I am aware of this question powershell : changing the culture of current session and of this question Changing current culture on SuperUser. The main problem that it doesn't work with Powershell 3.0 and 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 culture also does not accept new settings. Set-Culture in total does not work, regardless of whether I'm using admin access or not - anyway, it shouldn't be affected by this, as the effect is only for a single process. The Using-Culture from MSDN Powershell blog, adapted by SO community, works, but only partially, for example, with current culture of "ru-RU" I am able to get proper date from "6/19/15 2:26:02 PM" string, which is in the "en-US" culture via Using-Culture "en-US" {get-date -date "6/19/15 2:26:02 PM"}, but receiving an error in another language is not possible: say Using-Culture "en-US" {$null.test='1'} results in an error with Russian locale, as if the culture was not changed.

This behavior was tested on my local Win7 Professional workstation with Powershell 4.0 installed, and a Windows Server 2012 with Powershell 3.0 installed, which is required to parse wrongly localized date strings. The latter has UI culture of "en-US" and system locale "ru-RU".

So, is changing Powershell session's culture still possible with PS3 and above, and if yes, how? (Or is it bugs again, or change in PS3 that I am not aware of?)

回答1:

Changing culture only affects a the thread and is only applicable to that process. Your PS window is launched under the current locale and therefore the thread has that locale. Typing "[System.Threading.Thread]::CurrentThread.CurrentCulture" into a PS window launched under the current system locale, will always show that locale.

If you run this in ISE it should explain it little:

 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

Or, in a PS window:

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

It works fine.

If you want a PS window with a new culture, you'll need launch it using that culture, not try and change it afterwards.