2013-06-27 2 views
12

У меня есть сценарий powershell, который анализирует файл и отправляет электронное письмо, если он обнаруживает определенный шаблон. У меня есть настройка кода электронной почты внутри функции, и все работает отлично, когда я запускаю ее из ISE, но я использовал PS2EXE, чтобы иметь возможность запускать скрипт в качестве службы, но он не распознает функцию «электронная почта». мой код похож на этотСкрипт Powershell, не распознающий мою функцию

#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. 

ответ

22

Powershell процессы в порядке (сверху вниз), так что определение функции должно быть перед вызовом функции:

function email($text){ 
    #email $text 
} 

#Do things | 
foreach{ 
    email($_) 
} 

Это, вероятно, прекрасно работает в ISE, потому что у вас есть определение функции в памяти еще с предыдущего выполнения или теста.

+0

Спасибо, что работает сейчас! – laitha0

0

Когда дело доходит до вызова функции, PowerShell достаточно отличается от других программ-языков следующих способов:

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

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

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