2013-06-27 25 views
12

Mam skrypt programu Powerhell, który analizuje plik i wysyła wiadomość e-mail, jeśli wykryje określony wzorzec. Mam ustawienia kodu e-mail w funkcji i wszystko działa poprawnie, gdy uruchamiam go z ISE, ale użyłem PS2EXE, aby móc uruchomić skrypt jako usługę, ale nie rozpoznaje funkcji "e-mail". mój kod wygląda podobnie do tegoSkrypt Powershell nie rozpoznaje mojej funkcji

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

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

Kiedy przekonwertować go do exe i uruchomić go otrzymuję ten błąd:

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. 

Odpowiedz

22

PowerShell procesów w kolejności (góra-dół), więc definicja funkcji musi być przed wywołaniem funkcji:

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

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

Prawdopodobnie działa poprawnie w ISE, ponieważ w pamięci istnieje jeszcze definicja funkcji z poprzedniego uruchomienia lub testu.

+0

Dzięki teraz działa! – laitha0

0

Kiedy przychodzi funkcjonować-Call, PowerShell jest dość różni się od innych programowych-języków, w następujący sposób:

  1. Przy przejściu argumentów do funkcji, nawiasy nie są dozwolone (i budzi w nim błąd składniowy jeśli parametr Set-StrictMode jest ustawiony na -wersję 2.0 lub nowszą/najnowszą), należy użyć argumentów nawiasów, aby wywołać metodę, która może być metodą .NET lub metodą zdefiniowaną przez użytkownika (zdefiniowaną w klasie - w języku PS 5.0 lub nowszy).
  2. Parametry są rozdzielane spacjami i nie są rozdzielane przecinkami.
  3. Należy zachować ostrożność w miejscu definiowania funkcji. Jako kolejno PowerShell przetwarza linia po linii, w kolejności od góry do dołu, a więc funkcja musi być przeciwstawił przed wywołaniu funkcji:

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

ISE funkcja zdefiniowano poniżej funkcji-połączenie może wydaje się działać, ale (uwaga) jest to definicja pamięci podręcznej w pamięci z poprzedniego uruchomienia, więc jeśli zaktualizowałeś funkcję, którą wkręcasz.

Powiązane problemy