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