Powershell script не распознает мою функцию
У меня есть powershell script, который анализирует файл и отправляет электронное письмо, если он обнаруживает определенный шаблон. У меня есть настройка кода электронной почты внутри функции, и все работает отлично, когда я запускаю ее из ISE, но я использовал PS2EXE, чтобы иметь возможность запускать script в качестве сервиса, но он не узнайте функцию "email". мой код похож на этот
#Do things |
foreach{
email($_)
}
function email($text){
#email $text
}
Когда я конвертирую его в exe и запускаю, я получаю эту ошибку:
The term 'email' is not recognized as teh name of a cmdlet, function, script file,
or operable program. Check the spelling of the name, or if a path was included,
verify that the path is correct and try again.
Ответы
Ответ 1
Powershell обрабатывает порядок (сверху вниз), поэтому определение функции должно быть перед вызовом функции:
function email($text){
#email $text
}
#Do things |
foreach{
email($_)
}
Он, вероятно, отлично работает в ISE, потому что у вас есть определение функции в памяти по-прежнему из предыдущего запуска или теста.
Ответ 2
Что касается вызовов функций, PowerShell довольно сильно отличается от других языков программирования следующими способами:
- При передаче аргументов в функцию круглые скобки НЕ допускаются (и вызовут ошибку разбора, если для Set-StrictMode установлено значение -version 2.0 или выше /Latest), однако для вызова метода необходимо использовать аргументы в скобках, которые могут либо метод .NET, либо метод, определенный пользователем (определенный в классе - в PS 5.0 или более поздней версии).
- Параметры разделены пробелом и не разделены запятыми.
-
Будьте осторожны в том, где вы определяете функцию. Поскольку PowerShell последовательно обрабатывает построчно в нисходящем порядке, следовательно, функция должна быть отключена до вызова этой функции:
Function func($para1){
#do something
}
func("arg1") #function-call
В ISE функция, определенная ниже вызова функции, может выглядеть как работающая, но (будьте осторожны) это определение кэшированной функции в памяти из предыдущего запуска, так что если вы обновили функцию, которую вы ввернули.