2012-09-28 24 views
6

Tenía la esperanza de que alguien me podría ayudar con las siguientes:PowerShell: ¿Cuál es la diferencia entre 1234 y (1234)?

Function Get-FormattedNameValuePair([string] $name, [object] $value) 
{ 
    return "$("{0,-24}" -f $name) : $("{0,15:N2}" -f $value)" 
} 

Write-Output (Get-FormattedNameValuePair -name MyField -value 1234) 

Los rendimientos superiores:

MyField     :   1234 

que esperaba, sin embargo:

MyField     :  1,234.00 

El resultado esperado es Correctamente devuelto si agrego corchetes de evaluación alrededor del 1234:

Write-Output (Get-FormattedNameValuePair -name MyField -value (1234)) 

El formato también funciona sin los soportes de evaluación si es llamado directamente en lugar de envuelta dentro de la función 'Get-FormattedNameValuePair'.

[string] $name = "MyField" 
[object] $value = 1234 
Write-Output "$("{0,-24}" -f $name) : $("{0,15:N2}" -f $value)" 

¿Alguien puede explicar el comportamiento anterior?

Respuesta

5

No puedo reproducir este V3

Function Get-FormattedNameValuePair([string] $name, [object] $value) 
{ 
    return "$("{0,-24}" -f $name) : $("{0,15:N2}" -f $value)" 
} 

Write-Output (Get-FormattedNameValuePair -name MyField -value 1234) 

MyField     :  1,234.00 

Pero puedo repro esto en V2. Si cambia el modelo [object] al [int], comenzará a funcionar como esperaba. Hay algo acerca de poner esto en un objeto que está causando el problema. Este error se puede mostrar un poco más sucintamente así:

function foo([object]$o) { "{0,15:N2}" -f $o } 
foo 1234 
     1234 

En V2 hay una serie de problemas conocidos relacionados con la envoltura de tipos de .NET en un tipo extendido PowerShell tipo de sistema conocido como PSObject. Esto parece estar relacionado con ese problema. Y de hecho está relacionado. Mira esto:

function foo([object]$o) { "{0,15:N2}" -f $o.psobject.baseobject } 
foo 1234 
    1,234.00 

Si desenvuelves el objeto para volver al original, obtienes la salida esperada. Chalk esto hasta un error de V2 que afortunadamente se ha solucionado en V3.

+0

Gracias Keith, estoy en la versión 2.0 de PS como se muestra en $ Host.Version. Obtengo el resultado "MyField: 1234", mientras esperaba "MyField: 1,234.00". ¿Qué resultado obtienes? –

+0

@MikeRosenblum También pude reproducir esto en V2. Actualicé mi respuesta para explicar lo que está pasando. –

+0

Magnífica respuesta Keith, gracias por dedicar el tiempo para comprobar esto tan a fondo. –

Cuestiones relacionadas