我对以下脚本的行为感到有点困惑:
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明确表示它是一个字符串。
发布于 2010-08-20 01:06:24
这里发生的情况是,在脚本中将变量$value类型化为Object[]。对Get-Member的调用之所以有效,是因为您通过管道将值传递到函数中。因此,它看到的不是数组,而是数组中的值,这些值实际上是String类型的。这可以通过使用以下不使用管道的Get-Member调用来查看
Get-Member -MemberType Method -InputObject $value这也是ToUpper正确失败的原因(它是一个数组,而不是一个String)。
发布于 2010-08-20 01:07:15
当您在powershell中通过管道传输任何内容的集合时,它将被“展开”并逐个发送到条形(管道)字符的右侧。这意味着数组的内容将被发送到get-member。Get-member只接受发送给它的第一个项目,因此它会显示字符串的成员。您的参数是测试类型,因此参数绑定器将$value设置为一个长度为1的数组,其中包含字符串“[array]”。
示例:
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
发布于 2010-08-20 01:07:12
$Value实际上是一个数组,因为这是在参数块中声明参数的方式。
https://stackoverflow.com/questions/3524227
复制相似问题