-Split Powershell ведет себя по-разному в зависимости от параметров метода - PullRequest
2 голосов
/ 06 января 2020

Если вы разделите 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 о разделении была в основном бесполезной.

1 Ответ

5 голосов
/ 06 января 2020

Разница в том, что в первом примере вы никогда не объявляли переменную, поэтому вы можете присвоить ей значения любого типа, и она примет их без принуждения, изменив ее тип в соответствии:

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

Но как только вы явно объявите тип $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

Однако вы можете изменить тип, повторно объявив его. Даже внутри функции:

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."

Насколько я знаю, нет способ «не объявлять» тип переменной, чтобы он возвращался к принятию любого типа значения, за исключением полного удаления переменной с помощью Remove-Variable.

...