.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;это также обычно дает вам вознаграждение за работу на более высоком уровне абстракции.