Передача аргумента в Powershell, казалось бы, не работает - PullRequest
9 голосов
/ 24 февраля 2012

Я чувствую, что делаю что-то глупое, но вот в чем проблема:

Function getPropertyOfFile($a, $b, $c)
{
    $a.GetDetailsOf($b, $c)
}

Если я передаю переменные $ a, $ b, $ c, которые соответствуют функции, она не говорит, что

"Ошибка вызова метода, поскольку [System.Object []] не содержит метод с именем 'GetDetailsOf'."

Однако, если я заменю напрямую $ a, $ b, $ c с аргументами, которые я передавал, и затем попытался запустить это, все работает нормально.

Что, черт возьми, происходит?

Примечание: Я использую ISE powershell и вводю функцию в powershell, копируя / вставляя ее в консоль.Я также работал в предположении, что если я введу новую функцию с тем же именем, она будет перезаписана.Есть ли лучший способ просто читать PS из .ps1?

Редактировать: Я пытаюсь обернуть ответ на этот вопрос в функции.

Редактировать 2:

Function getPropertyOfFile $a $b $c
{
    $a.GetDetailsOf($b, $c)
}

Дает ошибку Missing function body in function declaration. At line:1 char:28.

Ответы [ 2 ]

14 голосов
/ 24 февраля 2012

Функции в PowerShell называются аналогичными командлетам, поэтому вам не нужно разделять аргументы запятыми.

Ваш вызов, вероятно, выглядит следующим образом:

getPropertyOfFile($foo, $bar, $baz)

, что приводит к $a со значением $foo, $bar, $baz (массив), в то время как $b и $c равны $null.

Вам нужно назвать его так:

getPropertyOfFile $foo $bar $baz

, который,как уже отмечалось, идентично тому, как вы называете командлеты.Вы могли бы даже сделать

getPropertyOfFile -a $foo -c $baz -b $bar

, и в этот момент вы, вероятно, заметили, что аргументы вашей функции не очень хорошо названы;1023 * ваше объявление функции отлично .Проблема в коде , который вы не публиковали , но он легко выводится для людей с опытом PowerShell.А именно, вызов вашей функции.

3 голосов
/ 24 февраля 2012

Вы должны разделять аргументы при вызове функции с пробелами, а не с запятыми, т.е.

getPropertyOfFile $arg1 $arg2 $arg3

вместо

getPropertyOfFile $arg1, $arg2, $arg3

Вторая форма передаст один массив, содержащий $arg1, $arg2 и $arg3 в качестве параметра $ a

...