2012-09-28 7 views
6

miałem nadzieję, że ktoś może mi pomóc z następujących:PowerShell: Jaka jest różnica między 1234 a (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) 

Powyższe zwrotów:

MyField     :   1234 

Spodziewałem się jednak:

MyField     :  1,234.00 

Oczekiwany wynik jest Poprawnie zwrócony, jeśli dodam nawiasy oceny wokół 1234:

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

Formatowanie działa również bez nawiasów oceny, jeśli zostanie wywołane bezpośrednio, zamiast zapakowane w funkcję "Get-FormattedNameValuePair".

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

Czy ktoś może wyjaśnić powyższe zachowanie?

Odpowiedz

5

I nie można odtworzyć to na 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 

Ale mogę to powtórzenia błędu na V2. Jeśli zmienisz rzutowanie [object] na [int], zacznie działać zgodnie z oczekiwaniami. Jest coś o umieszczeniu tego w obiekcie, który powoduje problem. Ten błąd może być pokazany trochę bardziej zwięźle tak:

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

W V2 istnieje szereg znanych problemów związanych z owijania .NET typów w PowerShell rozszerzona typu typu systemu znanego jako PSObject. Wygląda na to, że jest związany z tym problemem. I rzeczywiście jest to powiązane. Sprawdź to:

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

Po odłożeniu obiektu, aby powrócić do oryginału, otrzymasz oczekiwany wynik. Chalk to do błędu V2, który na szczęście został naprawiony w V3.

+0

Dzięki Keith, jestem na PS w wersji 2.0, jak pokazuje $ Host.Version. Otrzymałem wynik "MyField: 1234", podczas gdy oczekiwałem "MyField: 1,234.00". Jaki masz wynik? –

+0

@MikeRosenblum Udało mi się również zaimplementować to na V2. Zaktualizowano moją odpowiedź, aby wyjaśnić, co się dzieje. –

+0

Znakomita odpowiedź Keith, dzięki za poświęcenie czasu, aby to dokładnie sprawdzić. –

Powiązane problemy