web-dev-qa-db-fra.com

Script Powershell ne reconnaissant pas ma fonction

J'ai un script PowerShell qui analyse un fichier et envoie un e-mail s'il détecte un certain modèle. J'ai la configuration du code e-mail dans une fonction, et tout fonctionne bien lorsque je l'exécute à partir de l'ISE, mais j'ai utilisé PS2EXE pour pouvoir exécuter le script en tant que service, mais il ne reconnaît pas le fonction "email". mon code ressemble à ceci

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

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

Lorsque je le convertis en exe et l'exécute, j'obtiens cette erreur:

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.
16
laitha0

Powershell traite l'ordre (de haut en bas), la définition de la fonction doit donc être antérieure à l'appel de la fonction:

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

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

Cela fonctionne probablement très bien dans l'ISE car vous avez toujours la définition de fonction en mémoire d'une exécution ou d'un test antérieur.

31
JNK

En ce qui concerne les appels de fonction, PowerShell est assez différent des autres langages de programmation des manières suivantes:

  1. Lors du passage des arguments à une fonction, les parenthèses ne sont PAS autorisées (et déclencheront une erreur d'analyse si Set-StrictMode est défini sur -version 2.0 ou supérieure/Dernière), cependant, les arguments entre parenthèses doivent être utilisés pour appeler une méthode, qui peut soit être une méthode .NET ou une méthode définie par l'utilisateur (définie dans une classe - dans PS 5.0 ou supérieur).
  2. Les paramètres sont séparés par des espaces et non séparés par des virgules.
  3. Faites attention à l'endroit où vous définissez la fonction. Comme PowerShell traite séquentiellement ligne par ligne dans un ordre descendant, la fonction doit donc être défiée avant cette fonction est appelée:

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

Dans ISE, la fonction définie ci-dessous l'appel de fonction peut apparaître comme fonctionnant mais (attention) c'est la définition de fonction mise en cache dans une exécution précédente, donc si vous avez mis à jour la fonction, vous êtes vissé.

2
Eddie Kumar