2015-06-19 3 views
3

Я хочу изменить культуру принятых данных и ошибок в моем текущем интерактивном сеансе Powershell. Я знаю об этом вопросе powershell : changing the culture of current session и об этом вопросе Changing current culture на SuperUser. Основная проблема заключается в том, что он не работает с Powershell 3.0 и 4.0.Изменить текущую культуру сеанса Powershell, v3.0 + specific

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 в целом не работает, независимо от того, использую ли я доступ администратора или нет - в любом случае, это не должно зависеть от этого, так как это действие действует только для одного процесса. Using-Culture из блога MSDN Powershell, адаптированного сообществом SO, работает, но только частично, например, с текущей культурой «ru-RU» я могу получить правильную дату с »6/19/15 2:26:02 PM «string», которая находится в культуре «en-US» через Using-Culture "en-US" {get-date -date "6/19/15 2:26:02 PM"}, но получение ошибки на другом языке невозможно: скажем, Using-Culture "en-US" {$null.test='1'} приводит к ошибке с русской локалью, как будто культура не была изменена.

Это поведение было протестировано на моей рабочей станции Win7 Professional с установленным Powershell 4.0 и установлен Windows Server 2012 с установленной Powershell 3.0, которая необходима для разбора неправильно локализованных строк даты. Последний имеет UI-культуру «en-US» и системную локау «ru-RU».

Итак, изменилась культура сессии Powershell все еще возможна с PS3 и выше, и если да, то как? (Или это ошибки снова или изменения в PS3, о которых я не знаю?)

ответ

2

Изменение культуры влияет только на поток и применимо только к этому процессу. Окно вашего PS запускается под текущей локалью, и поэтому поток имеет этот язык. Ввод «[System.Threading.Thread] :: CurrentThread.CurrentCulture» в окно PS, запущенное в текущем системном локали, всегда будет показывать этот язык.

Если вы запустите в 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 с новой культурой, вам нужно запустить его с использованием этой культуры, а не пытаться изменить его впоследствии.

+0

Чтобы запустить PSwindow под культурой, просто добавьте следующее к любому из перечисленных выше: ** start-process 'c: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe' ** – Scepticalist

+0

У меня есть попробовал это без везения (продолжает показывать не английский выход), что я делаю неправильно? 'Set-Culture en-US start-process 'c: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe'' и внутри я запускаю' netsh wlan show drivers' – FrakyDale

Смежные вопросы