Question
Comment définir une fonction ? (Résolu)
- Pazefur
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 32
- Remerciements reçus 0
il y a 17 ans 2 mois #3722
par Pazefur
Comment définir une fonction ? (Résolu) a été créé 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
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
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
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> 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> $somme = add 3 5
PS> $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 \"émet\". En l'occurrence, l'objet émis est le résultat de l'addition.
Janel
[code:1]
PS> 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> $somme = add 3 5
PS> $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 \"émet\". En l'occurrence, l'objet émis est le résultat de l'addition.
Janel
Connexion ou Créer un compte pour participer à la conversation.
- Pazefur
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 32
- Remerciements reçus 0
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.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
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 \"dot sourçant\", c'est-à-dire en le précédant d'un point (suivi d'un espace):
[code:1]
PS> . .\somme.ps1
PS> 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
Tu dois lancer ton script en le \"dot sourçant\", c'est-à-dire en le précédant d'un point (suivi d'un espace):
[code:1]
PS> . .\somme.ps1
PS> 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.
- Pazefur
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 32
- Remerciements reçus 0
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 )
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.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
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 \"return\" 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> $ret = monscript.ps1
PS> if ($ret -eq 0) {\"glop!\"} else {\"pas glop!\"}
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 \"pipeline\" 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> type monscript.ps1
\"hello\"
1
PS> $ret = .\monscript.ps1
PS> $ret
hello
1
# 2e cas, le script écrit le texte avec write-host et émet le code retour vers la sortie standard :
PS> type monscript.ps1
write-host \"hello\"
1
PS> $ret = .\monscript.ps1
hello
PS> $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 (\"hello\") et un nombre entier (1).
Dans le 2e cas, l'exécution du script a provoqué l'affichage du texte \"hello\" 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
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> $ret = monscript.ps1
PS> if ($ret -eq 0) {\"glop!\"} else {\"pas glop!\"}
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 \"pipeline\" 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> type monscript.ps1
\"hello\"
1
PS> $ret = .\monscript.ps1
PS> $ret
hello
1
# 2e cas, le script écrit le texte avec write-host et émet le code retour vers la sortie standard :
PS> type monscript.ps1
write-host \"hello\"
1
PS> $ret = .\monscript.ps1
hello
PS> $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 (\"hello\") et un nombre entier (1).
Dans le 2e cas, l'exécution du script a provoqué l'affichage du texte \"hello\" 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.093 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Comment définir une fonction ? (Résolu)