Powershell 的 -split 行为因方法参数而异

Powershell's -split behaves differently depending on method parameters

如果拆分 string,则会得到 string[]

$foo = "apple,banana,coconut"
Write-Output $foo.GetType()

$foo = $foo -split ","
Write-Output $foo.GetType()

如果你拆分一个参数化的 string,你会得到一个 string

Function Get-Foo() {
    param ( 
      [string] $foo
    )

    Write-Output $foo.GetType()

    $foo = $foo -split ","
    Write-Output $foo.GetType()
}

为什么?

我对此进行了研究,但没有发现任何问题; Powershell 的文档 on split 在很大程度上没有帮助。

不同之处在于,在您的第一个示例中,您从未声明变量,因此您可以为其分配任何类型的值,它会在不强制的情况下接受它们,改变其类型以匹配:

PS > $foo = "apple,banana,coconut"
PS > Write-Output $foo.GetType().Name
String
PS > $foo = $foo -split ","
PS > Write-Output $foo.GetType().Name
String[]
PS > $foo = 1
PS > Write-Output $foo.GetType().Name
Int32

但是一旦你用 [string] 显式声明了 $foo 的类型,$foo.GetType() 将继续报告 string,你分配给它的任何内容都将是被迫 string。您不能仅通过为其分配新值来更改已声明变量的类型:

PS > [string] $foo = "apple,banana,coconut"
PS > Write-Output $foo.GetType().Name
String
PS > $foo = $foo -split ","
PS > Write-Output $foo.GetType().Name
String
PS > $foo = 1
PS > Write-Output $foo.GetType().Name
String

不过,您可以通过重新声明来更改类型。即使在函数内:

PS > [Int32] $foo = $foo
PS > Write-Output $foo.GetType().Name
Int32

请注意,如果该值不可解释为新类型,则此类重新声明分配将失败:

PS > [string] $foo = "apple,banana,coconut"
PS > [Int32] $foo = $foo
Cannot convert value "apple,banana,coconut" to type "System.Int32". Error: "Input string was not in a correct format."

据我所知,没有办法 "un-declare" 变量的类型,所以它返回到接受任何类型的值,而不是用 Remove-Variable.[=21 完全删除变量=]