2013-06-27 10 views
12

Ho uno script PowerShell che analizza un file e invia un messaggio di posta elettronica se rileva un determinato motivo. Ho installato il codice e-mail all'interno di una funzione e tutto funziona correttamente quando lo eseguo dall'ISE, ma ho usato PS2EXE per poter eseguire lo script come servizio ma non riconosce la funzione "email". il mio codice è simile a questoScript Powershell che non riconosce la mia funzione

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

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

Quando ho convertirlo in exe ed eseguirlo ottengo questo errore:

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. 

risposta

22

processi PowerShell in ordine (top-down), per cui la definizione della funzione deve essere prima che la chiamata di funzione:

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

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

probabilmente funziona bene nel ISE perché si ha la definizione della funzione in memoria ancora da una corsa o di prova prima.

+0

Grazie funziona ora! – laitha0

0

Quando si tratta di funzionare-call, PowerShell è piuttosto diverso da altri di programmazione-lingue in modi seguenti:

  1. Quando si passa gli argomenti a una funzione, le parentesi non sono ammessi (e solleva un errore di analisi in se Set-StrictMode è impostato su -versione 2.0 o superiore/Ultimo), tuttavia, gli argomenti con parentesi devono essere utilizzati per chiamare un metodo, che può essere un metodo .NET o un metodo definito dall'utente (definito all'interno di una classe - in PS 5.0 o superiore).
  2. I parametri sono separati da spazi e non separati da virgola.
  3. Prestare attenzione a dove si definisce la funzione. Come PowerShell sequenzialmente elabora linea per linea in ordine decrescente, quindi la funzione deve essere sfidato prima la funzione viene chiamata:

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

In ISE, la funzione definita sotto la funzione di guardia può sembra funzionare ma (attenzione) è la definizione della funzione memorizzata nella cache da una precedente esecuzione, quindi se hai aggiornato la funzione sei fregato.

Problemi correlati