Не удается выполнить Function.Invoke с несколькими параметрами в PowerShell?

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

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"

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


person leeand00    schedule 22.10.2018    source источник


Ответы (1)


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

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

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

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

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

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

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

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


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

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


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

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

person mklement0    schedule 22.10.2018