PowerShell Передача нескольких параметров в метод класса не работает - PullRequest
0 голосов
/ 26 февраля 2019

У меня странная проблема с PowerShell.Я пытаюсь передать в метод класса несколько параметров, но это не удается.Вместо этого я смог передать несколько параметров глобальной функции, и это сработало.Попытка передать переменное количество параметров в метод класса вместо этого дает сбой!

Вот мой код:

class TestParams {
    [int] $dummyVar

    TestParams() {
        $this.dummyVar = 0
    }

    [void]myMethod() {
        for ($index = 0; $index -lt $args.Count; $index++) {
            Write-Host $args[$index]
        }
    }
}

function testFunc() {
    for ($index = 0; $index -lt $args.Count; $index++) {
        Write-Host $args[$index]
    }
}

testFunc '1' '2' '3' # works

$myTestObj = New-Object TestParams
$myTestObj.myMethod "A" "B" "C" # fails

Как видно из запуска моего кода, он выдает такие сообщения об ошибках, как:

At C:\*****\testParams.ps1:25 char:21
+ $myTestObj.myMethod "A" "B" "C"
+                     ~~~
Unexpected token '"A"' in expression or statement.

Я не знаю, что вызывает эту ошибку!Ребята, можете ли вы помочь мне отладить это?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

PowerShell пользовательские классы (PSv5 +) работают больше как код C # , не как функции и скрипты PowerShell:

  • Объявления методов / конструкторов , а также вызовы должны использовать метод синтаксис , т. Е. (...) вокруг списка , разделенных аргументов, а не команда синтаксис ( пробел -разделенные аргументы без с включением (...));Например, если .MyMethod() имеет 3 различных параметра:

    • $obj.MyMethod('A', 'B', 'C') вместо $obj.MyMethod 'A' 'B' 'C'
  • Любые передаваемые аргументыдолжен связываться с формально объявленными параметрами - нет поддержка доступа к произвольным аргументам через автоматическую переменную $Args. [1]

  • Существует нет неявное output поведение: если методы не объявляют возвращаемый тип или не используют [void], они должны использовать return для возврата значения.

Полезный ответ Матиаса Р. Джессена показывает, как реализовать ваш метод с открытым числом аргументов через *Параметр 1064 * array , эмулирующий функциональность $Args, доступную только для функций .


[1] Из-за ошибки в PowerShell Core 6.2.На 0-rc.1, $Args можно неожиданно ссылаться в методе - несмотря на то, что он не был инициализирован - но всегда оценивается как пустой массив - см. этот выпуск GitHub .

0 голосов
/ 26 февраля 2019

Вам необходимо объявить параметры в определении метода:

[void]
myMethod( [array]$arguments ) {
    for ($index = 0; $index -lt $arguments.Count; $index++) {
        Write-Host $arguments[$index]
    }
}

Обратите внимание, что я намеренно изменил имя автоматической переменной args на другое, иначе оно не будет работать.

Для вызова метода используйте следующий синтаксис:

$myTestObj.myMethod(@('A', 'B', 'C'))
# or
$argument = 'A', 'B', 'C'
$myTestObj.myMethod($argument)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...