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 довольно сильно отличается от других языков программирования следующими способами:

  1. При передаче аргументов в функцию круглые скобки НЕ допускаются (и вызовут ошибку разбора, если для Set-StrictMode установлено значение -version 2.0 или выше /Latest), однако для вызова метода необходимо использовать аргументы в скобках, которые могут либо метод .NET, либо метод, определенный пользователем (определенный в классе - в PS 5.0 или более поздней версии).
  2. Параметры разделены пробелом и не разделены запятыми.
  3. Будьте осторожны в том, где вы определяете функцию. Поскольку PowerShell последовательно обрабатывает построчно в нисходящем порядке, следовательно, функция должна быть отключена до вызова этой функции:

        Function func($para1){
              #do something
        }
        func("arg1")  #function-call
    

В ISE функция, определенная ниже вызова функции, может выглядеть как работающая, но (будьте осторожны) это определение кэшированной функции в памяти из предыдущего запуска, так что если вы обновили функцию, которую вы ввернули.