Question Comment définir une fonction ? (Résolu)

Plus d'informations
il y a 17 ans 2 mois #3722 par Pazefur
Bonjour, je suis tout nouveau ici ...

J'ai crée un script somme.ps1
[code:1]
function add ([int]$a,[int]$b){
$temp = $a + $b
Write-Output $temp
}
[/code:1]

Je voudrais savoir comment appeler ma fonction add à partir du Shell, j'ai beau chercher mais j'ai rien trouvé, ça doit être tout con mais j'ai pas réusi à retrouver la syntaxe exacte :(<br><br>Message édité par: Arnaud, à: 15/01/09 22:33

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 2 mois #3724 par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Lancer une commande
Il suffit d'appeler add en lui passant les deux arguments:

[code:1]
PS&gt; add 3 5
8
[/code:1]
Tu peux même récupérer directement le résultat de ta fonction dans une variable (ou l'utiliser dans une expression plus complexe):

[code:1]
PS&gt; $somme = add 3 5
PS&gt; $somme
8
[/code:1]
Au passage, tu peux écrire ta fonction de manière beaucoup plus simple:

[code:1]
function add ([int]$a,[int]$b) {
$a + $b
}
[/code:1]
En effet, le résultat d'une fonction est simplement tout object qu'elle \&quot;émet\&quot;. En l'occurrence, l'objet émis est le résultat de l'addition.

Janel

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 2 mois #3725 par Pazefur
Réponse de Pazefur sur le sujet Re:Lancer une commande
Merci pour ta réponse mais ça ne marche pas chez moi, je te rappelle que ma fonction add est dans un fichier séparé (somme.ps1), donc je vois pas trop comment mon shell reconnaitra ma fonction add ...

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 2 mois #3726 par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Lancer une commande
Ah oui pardon, ce point m'avait échappé.

Tu dois lancer ton script en le \&quot;dot sourçant\&quot;, c'est-à-dire en le précédant d'un point (suivi d'un espace):

[code:1]
PS&gt; . .\somme.ps1
PS&gt; add 3 5
8
[/code:1]
Cette syntaxe a pour effet d'exécuter le script dans le même contexte que la console et non pas un contexte séparé comme c'est le cas par défaut. Ca te permet d'accéder aux variables et fonctions définies dans ce script.

Janel

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 2 mois #3729 par Pazefur
Réponse de Pazefur sur le sujet Re:Lancer une commande
Merci beaucoup ça a marché ...

Tu m'as parlé de ce que retourne la fonction, ça m'intéresse beaucoup :)

En fait je dois développer des scripts powershell plus ou moins long, ils devront être lancés par du code C# et je devrais interpréter leur code retour (en gros vérifier que tout c'est bien passé).

Donc quelle sera mon code retour d'un script de la forme :
[code:1]
//intructions
...
// insctructions
...
// instructions
[/code:1]

(désolé trop l'habitude du return )

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 17 ans 2 mois #3735 par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Lancer une commande
Même principe: il suffit d'émettre une valeur représentant le code que tu veux retourner. En fait, le \&quot;return\&quot; est implicite.

Prenons un exemple simple ou un script doit retourner 0 en cas de succès ou 1 en cas d'échec. La valeur 0 ou 1 pourra être assignée à une variable en cours d'exécution du script, et en fin de script tu te contenteras d'émettre la variable:

[code:1]
# initialisation du code retour à 0 par défaut :
$CodeRetour = 0

# exécution du script :
...
if (failed) { $CodeRetour = 1 }

# fin d'exécution, émission du code retour :
$CodeRetour
[/code:1]
Tu pourras alors vérifier très simplement la bonne exécution de ton script:

[code:1]
PS&gt; $ret = monscript.ps1
PS&gt; if ($ret -eq 0) {\&quot;glop!\&quot;} else {\&quot;pas glop!\&quot;}
glop!
[/code:1]
Selon ce même principe, tu peux retourner n'importe quelle valeur, avec des détails sur le type d'erreur si tu le souhaites.

Si elle reste très simple, cette technique a un petit inconvénient. Dans mon exemple, tout objet émis par le script sera capturé par $ret. Si en cours d'exécution, le script affiche des lignes de texte, ces lignes se retrouveront dans $ret avec la valeur de $CodeRetour.

Pour t'en sortir, tu peux explicitement faire en sorte que les informations que ton script affiche soient envoyées vers la console et non pas vers la sortie standard, également assimilé au \&quot;pipeline\&quot; quand on passe cette sortie comme entrée à une autre commande. Ce pipeline est l'endroit où $ret va récupérer les objets émis par le script.

Voici un petit exemple pour t'aider à comprendre:

[code:1]
# 1er cas, le script émet deux objets: un texte et un code retour à 1 :
PS&gt; type monscript.ps1
\&quot;hello\&quot;
1
PS&gt; $ret = .\monscript.ps1
PS&gt; $ret
hello
1

# 2e cas, le script écrit le texte avec write-host et émet le code retour vers la sortie standard :
PS&gt; type monscript.ps1
write-host \&quot;hello\&quot;
1
PS&gt; $ret = .\monscript.ps1
hello
PS&gt; $ret
1
[/code:1]
Dans le 1er cas, l'exécution du script elle-même n'a provoqué aucun affichage. Tout a été récupéré par $ret. Cette variable contient deux objets, une chaîne (\&quot;hello\&quot;) et un nombre entier (1).

Dans le 2e cas, l'exécution du script a provoqué l'affichage du texte \&quot;hello\&quot; sur la console (Host par défaut utilisé par la commandelette write-host). La variable $ret n'a récupéré que le code retour, seul objet émis vers la sortie standard.

Une autre solution pourrait être d'émettre des objets Erreur depuis ton script, récupérables sous un format plus élaboré qu'un simple code retour, et éventuellement capturables par les mécanismes standard de gestion des erreurs de PowerShell (basiques dans la v1, plus élaborés dans la v2). Mais ça demande un peu plus de travail, dans un premier temps la solution ci-dessus devrait convenir.

Janel

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.069 secondes
Propulsé par Kunena