Как установить культуру в PowerShell? - PullRequest
9 голосов
/ 05 ноября 2010

Есть ли эквивалент PowerShell для:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

?Или как заставить все строковые выражения подчиняться культуре независимо от конфигурации машины?

Ответы [ 6 ]

5 голосов
/ 13 июня 2014

Для WinServer2012 и Win8 вы можете использовать Set-Culture.Поскольку Set-Culture устанавливает культуру для вашего пользователя, вам придется открыть еще один экземпляр powershell, чтобы извлечь из этого пользу.Также это не меняет культуру запуска экземпляров ps.Конечно, тогда вы можете запустить новый экземпляр powershell в вашем текущем экземпляре. Это не совсем то, о чем просят, но тесно связано.

Было бы замечательно, если бы они перенесли это обратно на Win7 и Server 2008 или сделали бы его функцией powershell itselft.

5 голосов
/ 05 ноября 2010

Это функция, которую я использую для тестирования строк / форматов в других культурах:

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    
    }
}
5 голосов
/ 05 ноября 2010

Я думаю, что это будет работать:

$currentThread = [System.Threading.Thread]::CurrentThread
$culture = [System.Globalization.CultureInfo]::InvariantCulture
$currentThread.CurrentCulture = $culture
$currentThread.CurrentUICulture = $culture

Эта идея пришла от:

http://blogs.msdn.com/b/powershell/archive/2006/04/25/583235.aspx

1 голос
/ 02 июня 2016

Этот ответ касается текущей культуры , которая определяет такие параметры, как формат даты, валюта, форматирование чисел, последовательность сортировки, ...; напротив, текущая культура пользовательского интерфейса определяет язык пользовательского интерфейса (меню, сообщения об ошибках, ...); Все элементы, обсуждаемые ниже, имеют аналоги UI-культуры (например, Get-UICulture против Get-Culture, $PSUICulture против $PSCulture ИСКЛЮЧИТЬ Set-Culture, для которых нет аналога.

Переход на другую культуру :

В .NET Framework v4.6 и выше, теперь вы можете назначить на [cultureinfo]::CurrentCulture (ранее это было только для чтения [1] ; в PSv3 был введен ускоритель типа [cultureinfo] PS; e.g.:

[cultureinfo]::CurrentCulture = 'de-DE'

эквивалентно (который также работает в v4.5 или ниже, по крайней мере до v2):

[System.Threading.Thread]::CurrentThread.CurrentCulture = 'de-DE'

CAVEAT : PowerShell использует инвариантную культуру в строковых контекстах, независимо от текущей культуры - см. этот ответ мой.

  • Оба метода изменяют культуру для текущего экземпляра PowerShell (поток) * только 1051 * .

    • Предостережение [исправлено в PowerShell Core как минимум с v6.0.2]: как уже отмечалось, для того, чтобы попробовать это в интерактивном PowerShell сеанс, введите все команды в одной строке, потому что эффект изменения культуры ограничен одной командной строкой (это все еще применяется к PSv3 +, даже если консоли там работают в режиме STA по умолчанию); например, чтобы напечатать немецкую дату:
      [cultureinfo]::CurrentCulture = 'de-DE'; Get-Date # must be on same line
  • Для постоянных изменений культуры для текущего пользователя используйте командлет Set-Culture , но, как отмеченный в полезном ответе mbx , это изменение вступает в силу только для будущих экземпляров PowerShell, а НЕ текущего.


Запрос настроек культуры:

  • [cultureinfo]::CurrentCulture и [System.Threading.Thread]::CurrentThread.CurrentCulture отражают текущий экземпляр PowerShell эффективный культура .

  • В отличие от этого Get-Culture командлет (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'.
Обратите внимание, что версия framework отличается от версии CLR (runtime), о которой сообщает $PSVersionTable.CLRVersion; например, v4.6 framework основан на v4.0 CLR - см. документы .

1 голос
/ 05 ноября 2010

См. здесь для деталей ObjectCmdletBase.Culture Property.

Получает и устанавливает значение Культуры параметр производного командлета.

0 голосов
/ 16 января 2019

Set-Culture работает на локальном сервере, но не работает при его запуске на удаленном компьютере Invoke-Command -ComputerName $server -ScriptBlock{ #Requires -RunAsAdministrator Set-Culture -CultureInfo en-GB; Set-TimeZone -Id "GMT Standard Time" }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...