首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发送到PowerShell的字符串参数不是真正的字符串吗?

发送到PowerShell的字符串参数不是真正的字符串吗?
EN

Stack Overflow用户
提问于 2010-08-20 01:02:10
回答 3查看 5.4K关注 0票数 5

我对以下脚本的行为感到有点困惑:

Test.ps1:

代码语言:javascript
复制
param(
    [array]$Value = $(throw "Give me a value")
)

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

运行脚本:

代码语言:javascript
复制
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明确表示它是一个字符串。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-20 01:06:24

这里发生的情况是,在脚本中将变量$value类型化为Object[]。对Get-Member的调用之所以有效,是因为您通过管道将值传递到函数中。因此,它看到的不是数组,而是数组中的值,这些值实际上是String类型的。这可以通过使用以下不使用管道的Get-Member调用来查看

代码语言:javascript
复制
Get-Member -MemberType Method -InputObject $value

这也是ToUpper正确失败的原因(它是一个数组,而不是一个String)。

票数 5
EN

Stack Overflow用户

发布于 2010-08-20 01:07:15

当您在powershell中通过管道传输任何内容的集合时,它将被“展开”并逐个发送到条形(管道)字符的右侧。这意味着数组的内容将被发送到get-member。Get-member只接受发送给它的第一个项目,因此它会显示字符串的成员。您的参数是测试类型,因此参数绑定器将$value设置为一个长度为1的数组,其中包含字符串“[array]”。

示例:

代码语言:javascript
复制
ps> @(1,"hello",3) | gm
... shows members of int32

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

为了在管道中看到数组的成员,您应该将它包装在另一个数组中,以便它成为展开的项:

代码语言:javascript
复制
ps> ,@("hello", 1, 3) | gm
... shows members of array

前导逗号",“创建了一个换行数组。

-Oisin

票数 4
EN

Stack Overflow用户

发布于 2010-08-20 01:07:12

$Value实际上是一个数组,因为这是在参数块中声明参数的方式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3524227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档