Как установить культуру в PowerShell?

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

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

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

5 ответов


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

$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


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

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    
    }
}

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

было бы аккуратно, если бы они перенесли это обратно на Win7 и Server 2008 или сделайте это функцией powershell.


посмотреть здесь подробности ObjectCmdletBase.Culture собственность.

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


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

переход на a другая культура:

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

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

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

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

предостережение: PowerShell использует инвариант культура в string-related контексты, независимо от того, что нынешняя культура - см. ответ шахты.

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

    • предостережение [исправлено в PowerShell базовый по крайней мере, с v6.0.2]: Как было отмечено, для того, чтобы попробовать в интерактивные сеанс PowerShell, введите все команды на один line, потому что эффект изменения культуры ограничен одной командной строкой (это все еще применяется на 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 эффективное культура.

  • напротив (PSv3+) и автоматический $PSCulture переменная (PSv3+; только для чтения) неизменно отражает культуру текущего экземпляра PowerShell в запуск время; то есть они всегда отражать постоянно настроенную культуру текущего пользователя во время запуска текущего экземпляра PowerShell (независимо от экземпляра-только изменения через [cultureinfo]::CurrentCulture = ... или будущее постоянные изменения через Set-Culture выполняется в этом случае).


[1] см.docs; чтобы определить, есть ли у вас хотя бы v4.6 установлен, ищите Version: значение на выходе из Get-Item 'registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'.
Обратите внимание, что рамки версия отличается от CLR (runtime) версия, как сообщается $PSVersionTable.CLRVersion; например, v4.6 рамки основано на v4.0 CLR - см. docs.