2010-08-19 65 views
5

我有點糊塗了下面的腳本的行爲:發送給PowerShell的字符串參數不是一個字符串嗎?

Test.ps1:

param(
    [array]$Value = $(throw "Give me a value") 
) 

Write-Host $Value 
$Value | Get-Member -MemberType Method 
$Value.ToUpper() 

運行腳本:

PS C:\Temp> .\weird.ps1 test 
TypeName: System.String 
Name MemberType Definition 
—- ———- ———- 
… 
ToUpper Method string ToUpper(), string ToUpper(System.Globalization.CultureInfo culture) 
… 
Method invocation failed because [System.Object[]] doesn’t contain a method named ‘ToUpper’. 
At C:\Temp\weird.ps1:6 char:15 
+ $Value.ToUpper <<<<() 
+ CategoryInfo : InvalidOperation: (ToUpper:String) [], RuntimeException 
+ FullyQualifiedErrorId : MethodNotFound 

爲什麼我得到一個MethodNotFound異常? Get-Member明確表示這是一個字符串。

回答

5

這裏發生了什麼變化$value在腳本中鍵入到Object[]。撥打Get-Member的呼叫是有效的,因爲您正在將該值傳遞給該函數。因此,不是查看數組,而是看到數組中的值確實輸入爲String。這可以通過使用下面的Get-Member呼叫被視爲無管道

Get-Member -MemberType Method -InputObject $value 

這也是爲什麼ToUpper的正確失敗(它是一個數組不是String)。

+0

感謝您的好解釋! – 2010-08-19 21:21:54

2

$ Value實際上是一個數組,因爲這就是您在參數塊中聲明參數的方式。

4

當你在powershell中管道任何東西的集合時,它會被「展開」並逐個發送到條(管道)字符的右側。這意味着數組的內容被髮送到get-member。 Get-member只接受發送給它的第一個項目,所以它會顯示你的字符串的成員。您的參數類型爲[array],因此參數綁定器將$ value設置爲長度爲1的數組,其中包含字符串「test」。

實施例:

ps> @(1,"hello",3) | gm 
... shows members of int32 

ps> @("hello", 1, 3) | gm 
... shows members of string 

爲了看到陣列的成員時,管,你應該在另一個數組包裹它,因此它成爲展開的項目:

ps> ,@("hello", 1, 3) | gm 
... shows members of array 

的領先的逗號「,」創建一個包裝數組。

-Oisin

相關問題