2012-09-28 27 views
6

Speravo che qualcuno mi potrebbe aiutare con le seguenti:PowerShell: Qual è la differenza tra 1234 e (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) 

I rendimenti di cui sopra:

MyField     :   1234 

mi aspettavo, però:

MyField     :  1,234.00 

Il risultato atteso è restituito correttamente se aggiungo parentesi di valutazione attorno al 1234:

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

La formattazione funziona anche senza parentesi di valutazione se viene richiamata direttamente anziché inserita nella funzione 'Get-FormattedNameValuePair'.

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

Qualcuno può spiegare il comportamento sopra?

risposta

5

Non posso riprodurre questo su 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 

Ma posso repro questo su V2. Se si modifica il cast [object] su [int], esso inizia a funzionare come previsto. C'è qualcosa nel mettere questo in un oggetto che sta causando il problema. Questo errore può essere visualizzata un po 'più succintamente in questo modo:

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

In V2 ci sono una serie di problemi noti relativi al confezionamento di tipi .NET in un PowerShell tipo esteso tipo di sistema noto come PSObject. Questo sembra essere correlato a quel problema. E infatti è correlato. Verificare:

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

Se si disfa l'oggetto per tornare all'originale, si ottiene l'output previsto. Ricalcolo fino a un bug V2 che è stato fortunatamente corretto in V3.

+0

Grazie Keith, sono su PS versione 2.0 come mostrato da $ Host.Version. Ottengo il risultato "MyField: 1234", mentre mi aspettavo "MyField: 1,234.00". Che risultato ottieni? –

+0

@MikeRosenblum Sono stato in grado di riprodurre anche questo su V2. Aggiornato la mia risposta per spiegare cosa sta succedendo. –

+0

Risposta superba Keith, grazie per averci dedicato un po 'di tempo per verificarlo. –

Problemi correlati