Является ли строковый параметр, отправленный в PowerShell, на самом деле не строкой? - PullRequest
5 голосов
/ 19 августа 2010

Я немного запутался в поведении сценария ниже:

Test.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-Member четко говорит, что это строка.

Ответы [ 3 ]

5 голосов
/ 19 августа 2010

Здесь происходит то, что переменная $value набрана в Object[] в скрипте. Вызов Get-Member работает, потому что вы передаете значение в функцию. Следовательно, вместо просмотра массива он видит значения в массиве, которые действительно имеют тип String. Это можно просмотреть с помощью следующего вызова Get-Member без трубопровода

Get-Member -MemberType Method -InputObject $value

Это также, почему ToUpper корректно завершается ошибкой (это массив не String).

4 голосов
/ 19 августа 2010

Когда вы передаете коллекцию чего-либо в PowerShell, она «разворачивается» и отправляется по одному справа от символа бара (трубы).Это означает, что содержимое массива будет отправлено get-member.Get-member принимает только первый отправленный элемент, поэтому он показывает вам элементы строки.Ваш параметр имеет тип [array], поэтому связыватель параметра устанавливает $ 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

Начальная запятая "," создает упаковочный массив.

-Oisin

2 голосов
/ 19 августа 2010

$ Значение на самом деле является массивом, потому что именно так вы объявляете параметр в блоке параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...