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

ale*_*lex 2 powershell powershell-3.0

如果你拆分 a string,你会得到一个string[]

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

$foo = $foo -split ","
Write-Output $foo.GetType()
Run Code Online (Sandbox Code Playgroud)

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

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

    Write-Output $foo.GetType()

    $foo = $foo -split ","
    Write-Output $foo.GetType()
}
Run Code Online (Sandbox Code Playgroud)

为什么?

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

Mar*_*eed 5

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

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
Run Code Online (Sandbox Code Playgroud)

但是一旦你用 明确声明了$foo的类型[string]$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
Run Code Online (Sandbox Code Playgroud)

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

PS > [Int32] $foo = $foo
PS > Write-Output $foo.GetType().Name
Int32
Run Code Online (Sandbox Code Playgroud)

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

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."
Run Code Online (Sandbox Code Playgroud)

据我所知,没有办法“取消声明”变量的类型,因此它可以恢复接受任何类型的值,而不能使用Remove-Variable.