Не получается сделать Function.Invoke с несколькими параметрами в powershell? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь передать функцию методу, а затем передать параметры методу, который я передал при его вызове, но если я передал более одного параметра, метод завершится с ошибкой:

function debugMeStuffs($someBlah, $somePoo) {

    Write-Host $someBlah            
    Write-Host $somePoo
}


function invokeOnHosts ([scriptblock]$funcToCall, $param1, $param2, $startRange, $endRange) {
#Param($funcToCall)

$i = $startRange

for($i = [int]$startRange; $i -le $endRange; $i++) {

    # HOW DO I MAKE THIS WORK WITH MULTIPLE PARAMETERS?!?!?!?
    $funcToCall.Invoke('blah' 'poo')
}
}

invokeOnHosts $function:debugMeStuffs "param1" "param2" 4 7

Вещи, которые я пробовал:

  • $funcToCall("blah" "poo")
  • $funcToCall('blah' 'poo')
  • $funcToCall.Invoke("blah" "poo")
  • $funcToCall.Invoke('blah' 'poo')
  • $funcToCall 'blah' 'poo'
  • $funcToCall.Invoke 'blah' 'poo'
  • $funcToCall "blah" "poo"
  • $funcToCall.Invoke "blah" "poo"

Кажется, что ничего из вышеперечисленного не работает.Есть ли что-то еще, что мне нужно сделать, чтобы сделать эту работу?

1 Ответ

0 голосов
/ 22 октября 2018

.Invoke() - это метод .NET , поэтому применяется обычный синтаксис вызова метода : вам нужно

  • скобки - (...) -вокруг списка аргументов
  • вы должны разделить аргументы с помощью ,
$funcToCall.Invoke('blah', 'poo')

Это отличается от собственного синтаксиса PowerShell для вызова командлетов и функции , которые оболочечные [1] :

  • нет (...) вокруг списка аргументов

  • аргументы должны быть разделены пробелами .

& $funcToCall blah poo  # equivalent of the method call above.

Команда, подобная приведенной выше, анализируется в аргумент режим , поэтому цитируя аргументы в этом простом случае: опционально .

Обратите внимание на необходимость &, оператор PowerShell , оператор вызова , который необходим для выполнения блок скриптов хранится в $funcToCall;это обычно необходимо для вызова команды, хранящейся в переменной , а также для имен / путей команд в кавычках .


Учитывая, чтолегко запутаться между синтаксисом команд PowerShell и синтаксисом методов .NET, лучше придерживаться встроенных в PowerShell функций [2] , если это возможно.
ЭтоОднако возможность непосредственного вызова методов в типах .NET является прекрасной возможностью расширения.

Чтобы избежать случайного использования синтаксиса метода при вызове команд PowerShell, вы можете использовать Set-StrictMode -Version 2 иливыше, но учтите, что это влечет за собой дополнительные проверки на строгость.


[1] PowerShell - это, в конце концов, shell - но это также a полнофункциональный язык сценариев , который предлагает практически неограниченный доступ к .NET Framework.
Согласование этих двух личностей - сложный процесс балансировки, и подобный оболочке синтаксис вызова команд частопроблема для новичков с опытом программирования, учитывая, что остальная часть языка похожа на традиционный язык программирования и что вызовы методов для типов .NET действительно используют традиционный синтаксис.

[2]Это означает, что предпочтение командлетам, функциям и операторам PowerShell использовать методы базовых типов .NET;это также обычно дает вам вознаграждение за работу на более высоком уровне абстракции.

...