代码之家  ›  专栏  ›  技术社区  ›  Peter Moberg

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

  •  5
  • Peter Moberg  · 技术社区  · 14 年前

    测试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成员清楚地表示它是一个字符串。

    3 回复  |  直到 14 年前
        1
  •  5
  •   JaredPar    14 年前

    这里发生的是变量 $value 键入到 Object[] 在剧本里。呼叫 Get-Member String . 可以通过以下方式查看 获取成员 无管道呼叫

    Get-Member -MemberType Method -InputObject $value
    

    这也是ToUpper正确失败的原因(它是一个数组而不是一个数组) 字符串

        2
  •  4
  •   x0n    14 年前

    当您在powershell中通过管道传输任何内容的集合时,它将被“展开”并逐个发送到条(管道)字符的右侧。这意味着 目录 数组的一部分发送给get成员。Get member只接受发送给它的第一个项,因此它显示字符串的成员。您的参数的类型为 [array] ,因此参数binder将$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
    

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

    -奥辛

        3
  •  2
  •   driis    14 年前

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