2010-11-05 20 views
8

¿Hay alguna equivalente PowerShell para:¿Cómo establecer cultura en PowerShell?

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; 

? ¿O cómo configurar la fuerza de todas las cadenas para obedecer una cultura independientemente de las configuraciones de la máquina?

Respuesta

5

creo que esto va a funcionar:

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

Esta idea surgió a partir de:

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

+1

No me arroja, pero la cultura no cambiado de esta manera. –

+0

@Roman Descubrí el problema con la declaración y la corrigí. En C# funcionaría. –

+0

@XMLforDummies: su excepción se ve mal, como si algo estuviera muy mal en su PowerShell. ¿Puedes escribir esto: '[System.Globalization.CultureInfo]'? ¿Funciona o falla también? –

1

Ver here para detalles de ObjectCmdletBase.Culture Propiedad.

Obtiene y establece el valor del parámetro Culture del cmdlet derivado.

+0

Como no sé nada de PowerShell, ¿podría proporcionar un fragmento simple que podría pasar en la primera línea de cada script que tengo aquí, así que se ejecutará de acuerdo con la InvariantCulture? –

+0

En realidad, hay un método mejor aquí, con ejemplos: http://blogs.msdn.com/b/powershell/archive/2006/04/25/583235.aspx –

5

Esta es la función que utilizo para sarta de pruebas/formatos en otras culturas:

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

Para WinSer ver2012 y Win8 puede usar Set-Culture. Como Set-Culture establece la cultura para su usuario, tendría que abrir otra instancia de powershell para beneficiarse de eso. Tampoco cambia la cultura de ejecutar instancias ps. Por supuesto, puede iniciar una nueva instancia de powershell en su instancia actual. Esto no es exactamente lo que se solicita, pero está estrechamente relacionado.

Estaría bien, si lo conectaran a Win7 y Server 2008 o lo convertirían en una característica de powershell itselft.

+0

El documento vinculado dice "Establece la cultura del usuario para la cuenta de usuario actual". - así que parece que no solo establece esto para el proceso actual sino a nivel mundial. –

+0

@SebastianKrysmanski El comportamiento es de hecho un poco extraño. Cambia la cultura del usuario según lo prometido, pero su instancia de powershell mantiene su cultura: abra un powershell, 'Get-Culture' (da en-US), luego' Set-Culture de-DE', usando 'Get-Culture' da en-US nuevamente y un formato de 'fecha' como de costumbre. Pero cuando abres otra powershell y 'Get-Culture' te da formatos de-DE, 'date' como los alemanes harían. – mbx

1

Esta respuesta se refiere al cultura actual, que determina configuraciones tales como formato de fecha, moneda, formato de número, secuencia de clasificación, ...; por el contrario, UI culture, determina el idioma de la UI (menús, mensajes de error, ...); Todos los elementos discutidos a continuación tienen análogos UI-cultivo (por ejemplo, Get-UICulture vs. Get-Culture, $PSUICulture vs. $PSCulture SALVO Set-Culture, para la que no hay analógico

Cambio a una cultura diferente:.

En el .NET v4.6 Marco y superior, ahora puede asignar -[cultureinfo]::CurrentCulture (anteriormente, era de sólo lectura [1]; el [cultureinfo] Se introdujo el acelerador de tipo PS en PSv3); e.g .:

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

es equivalente a (que también funciona en v4.5 o inferior, hasta al menos v2):

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

Claves clínicas: PowerShell utiliza los invariante cultura en contextos relacionadas con cadenas, independientemente de lo que la cultura actual es - ver this answer de mía.

  • Ambos métodos cambiar la cultura para el actual ejemplo PowerShell (thread) solamente.

    • Como se ha señalado, con el fin de probar esto en una sesión interactiva PowerShell, escriba todos los comandos en una sola línea , ya que el efecto de cambio cultural se limita a una sola línea de comandos (esto todavía se aplica en PSv3 +, aunque las consolas allí se ejecutan en modo STA por defecto); por ejemplo, para imprimir una fecha Alemán:
      [cultureinfo]::CurrentCulture = 'de-DE'; Get-Date # must be on same line
  • Para una persistente cambio cultura para el usuario actual, utilice el Set-Culture cmdlet, pero, como se señala en mbx's helpful answer, este cambio sólo tiene efecto para futuras instancias de PowerShell, NO la actual.


Consulta de configuraciones de referencia cultural:

  • [cultureinfo]::CurrentCulture y [System.Threading.Thread]::CurrentThread.CurrentCulture reflejan efectiva la cultura actual del de ejemplo PowerShell.

  • Por el contrario, la Get-Culture cmdlet (PSV3 +) y el automático $PSCulture variable (PSV3 +; sólo lectura) reflejar invariablemente cultura del actual ejemplo PowerShell en inicio tiempo; es decir, que siempre reflejan la cultura persistentemente configurado del usuario actual en el momento de la instancia actual de PowerShell se inició (independientemente de-único caso cambios a través de [cultureinfo]::CurrentCulture = ... o futuras cambios persistentes a través de Set-Culture realizadas en esa instancia).


[1] Ver la docs; para determinar si tiene al menos v4.6 instalado, busque el valor Version: en la salida de Get-Item 'registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'.
Tenga en cuenta que framework versión es distinta de CLR (runtime) versión según lo informado por $PSVersionTable.CLRVersion; por ejemplo, la estructura v4.6 se basa en la versión 4.0 CLR - ver docs.

Cuestiones relacionadas