Question
Retourner plusieurs valeurs dans une fonction
- THIBURCE
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 17
- Remerciements reçus 0
il y a 10 ans 10 mois #19696
par THIBURCE
Retourner plusieurs valeurs dans une fonction a été créé par THIBURCE
Bonjour,
J'ai un soucis avec un fonction qui retourne plusieurs valeurs.
Je voudrais savoir si il y une meilleur façon de faire cela car je pense que ce n'est pas très bon ^^
[code:1]
function decryptFichier($fichier, $password, $fichierDecrypt)
{
$erreurCheck = $false
try
{
# On decrypte le fichier à l'aide de l'exécutable AxCrypt
$process = New-Object -TypeName System.Diagnostics.Process
$process.StartInfo.CreateNoWindow = $true
$process.StartInfo.UseShellExecute = $true
$process.StartInfo.FileName = \"axcrypt.exe\"
$process.StartInfo.WorkingDirectory = \"C:\Program Files\Axantum\AxCrypt\"
$process.StartInfo.Arguments = \"-n $fichierDecrypt\", \"-b 1331\", \"-k $password\", \"-d $fichier\"
$process.Start()
$timer = $process.WaitForExit()
$valeur = $process.ExitCode
}
catch
{
write-host \"Erreur de décryptage: $_\"
$erreurCheck = $true
}
return $timer, $erreurCheck
}
[/code:1]
Le gros problème est que la valeur retournée par $erreurCheck est bien à False dans la fonction par contre quand elle est retournée un espace s'ajoute devant le false et la valeur est de type System.Object.
J'ai utilisé cette technique à plusieurs reprise mais ça ne m'a jamais fait ce coup la ^^'
Je sais que mon ExitCode ici renvoi justement un espace mais pourquoi celui-ci s'ajouterai ?
Merci d'avance
J'ai un soucis avec un fonction qui retourne plusieurs valeurs.
Je voudrais savoir si il y une meilleur façon de faire cela car je pense que ce n'est pas très bon ^^
[code:1]
function decryptFichier($fichier, $password, $fichierDecrypt)
{
$erreurCheck = $false
try
{
# On decrypte le fichier à l'aide de l'exécutable AxCrypt
$process = New-Object -TypeName System.Diagnostics.Process
$process.StartInfo.CreateNoWindow = $true
$process.StartInfo.UseShellExecute = $true
$process.StartInfo.FileName = \"axcrypt.exe\"
$process.StartInfo.WorkingDirectory = \"C:\Program Files\Axantum\AxCrypt\"
$process.StartInfo.Arguments = \"-n $fichierDecrypt\", \"-b 1331\", \"-k $password\", \"-d $fichier\"
$process.Start()
$timer = $process.WaitForExit()
$valeur = $process.ExitCode
}
catch
{
write-host \"Erreur de décryptage: $_\"
$erreurCheck = $true
}
return $timer, $erreurCheck
}
[/code:1]
Le gros problème est que la valeur retournée par $erreurCheck est bien à False dans la fonction par contre quand elle est retournée un espace s'ajoute devant le false et la valeur est de type System.Object.
J'ai utilisé cette technique à plusieurs reprise mais ça ne m'a jamais fait ce coup la ^^'
Je sais que mon ExitCode ici renvoi justement un espace mais pourquoi celui-ci s'ajouterai ?
Merci d'avance
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 10 ans 10 mois #19697
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Retourner plusieurs valeurs dans une fonction
Une petite démo :
[code:1]
function decryptFichier($fichier, $password, $fichierDecrypt)
{
$erreurCheck = $false
try
{
$timer = $null
}
catch
{
write-host \"Erreur de décryptage: $_\"
$erreurCheck = $true
}
return $timer, $erreurCheck
}
$Result=decryptFichier
$Result
# False
[byte[]][char[]]\"$result\"
# 32
# 70 ...
$OFS='Gotcha '
\"$result\"
#Gotcha False
[/code:1]
Cet appel $process.WaitForExit() renvoi Void, c'est à dire $null qui n'est pas rien dans ton cas :
[code:1]
$result.Count
#2
$OFS=' '
$result=@($null,$null)
[byte[]][char[]]\"$result\"
#32 -> $OFS
[/code:1]
[code:1]
function decryptFichier($fichier, $password, $fichierDecrypt)
{
$erreurCheck = $false
try
{
$timer = $null
}
catch
{
write-host \"Erreur de décryptage: $_\"
$erreurCheck = $true
}
return $timer, $erreurCheck
}
$Result=decryptFichier
$Result
# False
[byte[]][char[]]\"$result\"
# 32
# 70 ...
$OFS='Gotcha '
\"$result\"
#Gotcha False
[/code:1]
Cet appel $process.WaitForExit() renvoi Void, c'est à dire $null qui n'est pas rien dans ton cas :
[code:1]
$result.Count
#2
$OFS=' '
$result=@($null,$null)
[byte[]][char[]]\"$result\"
#32 -> $OFS
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 10 ans 10 mois #19698
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Retourner plusieurs valeurs dans une fonction
Un complément :
[code:1]
#Affectation multiple
$T,$E=decryptFichier
$T -eq $null
#True
$E.GetType()
#
# IsPublic IsSerial Name BaseType
#
----
# True True Boolean System.ValueType
[/code:1]
On peut utiliser cette approche, il faut juste documenter la fonction :
[code:1]
$a=get-help get-process -full
$a.returnValues
[/code:1]
[code:1]
#Affectation multiple
$T,$E=decryptFichier
$T -eq $null
#True
$E.GetType()
#
# IsPublic IsSerial Name BaseType
#
----
# True True Boolean System.ValueType
[/code:1]
On peut utiliser cette approche, il faut juste documenter la fonction :
[code:1]
$a=get-help get-process -full
$a.returnValues
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- THIBURCE
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 17
- Remerciements reçus 0
il y a 10 ans 10 mois #19714
par THIBURCE
Réponse de THIBURCE sur le sujet Re:Retourner plusieurs valeurs dans une fonction
Bonjour,
Merci pour votre réponse, j'avoue ne pas avoir tout compris mais j'ai testé, je n'ai pas modifié ma fonction qui retourne donc timer et erreurCheck et je récupère le tout dans une variable result comme vous le montrez plus haut.
Problème, quand je fais result.Count j'obtiens 3 !
Est-ce normal ? J'ai l'impression que c'est le exitcode qui c'est incrusté sachant que process.exitcode se fait après le timer. Mais pourquoi il s'ajoute ^^'
Et aussi quand je fais :
[code:1]$OFS = 'Gotcha '
\"$result\"[/code:1]
J'obtiens :
[code:1]TrueGotcha Gotcha False[/code:1]
Ce qui je pense est lié au fait que j'ai 3 valeurs dans result.
PS : J'avais oublié de dire que le WaitForExit renvoi un booléen
Encore merci pour votre aide ^^<br><br>Message édité par: Riza, à: 15/05/15 10:08
Merci pour votre réponse, j'avoue ne pas avoir tout compris mais j'ai testé, je n'ai pas modifié ma fonction qui retourne donc timer et erreurCheck et je récupère le tout dans une variable result comme vous le montrez plus haut.
Problème, quand je fais result.Count j'obtiens 3 !
Est-ce normal ? J'ai l'impression que c'est le exitcode qui c'est incrusté sachant que process.exitcode se fait après le timer. Mais pourquoi il s'ajoute ^^'
Et aussi quand je fais :
[code:1]$OFS = 'Gotcha '
\"$result\"[/code:1]
J'obtiens :
[code:1]TrueGotcha Gotcha False[/code:1]
Ce qui je pense est lié au fait que j'ai 3 valeurs dans result.
PS : J'avais oublié de dire que le WaitForExit renvoi un booléen
Encore merci pour votre aide ^^<br><br>Message édité par: Riza, à: 15/05/15 10:08
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 10 ans 10 mois #19716
par Philippe
Réponse de Philippe sur le sujet Re:Retourner plusieurs valeurs dans une fonction
bonjour Riza
Riza écrit:
comme la indique Laurent WaitForExit renvoie RIEN enfin void soit $null, voir ici
contrairement à powershell v4 peut etre v3, en v2 dans une fonction l'appel d'une fonction qui renvoie une valeur perturbe le return !
la fonction start() renvoie une valeur voir ici , qui dans ta fonction altère le résultat du return
si tu fait ça tu devrait plus avoir de problème :
[code:1]$r = $process.Start()[/code:1]
correction après reponse de Laurent :
le résultat de start et bien dans le return/pipeline (le true)
tu a un \"espace\" qui correspond à $timer (la valeur null)
et enfin le false de $erreurCheck
Message édité par: 6ratgus, à: 15/05/15 12:05
Message édité par: 6ratgus, à: 15/05/15 12:07<br><br>Message édité par: 6ratgus, à: 15/05/15 12:31
Riza écrit:
PS : J'avais oublié de dire que le WaitForExit renvoi un booléen
comme la indique Laurent WaitForExit renvoie RIEN enfin void soit $null, voir ici
tu utilise la version 2 de PowershellCe qui je pense est lié au fait que j'ai 3 valeurs dans result.
contrairement à powershell v4 peut etre v3, en v2 dans une fonction l'appel d'une fonction qui renvoie une valeur perturbe le return !
la fonction start() renvoie une valeur voir ici , qui dans ta fonction altère le résultat du return
si tu fait ça tu devrait plus avoir de problème :
[code:1]$r = $process.Start()[/code:1]
correction après reponse de Laurent :
le résultat de start et bien dans le return/pipeline (le true)
tu a un \"espace\" qui correspond à $timer (la valeur null)
et enfin le false de $erreurCheck
Message édité par: 6ratgus, à: 15/05/15 12:05
Message édité par: 6ratgus, à: 15/05/15 12:07<br><br>Message édité par: 6ratgus, à: 15/05/15 12:31
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 10 ans 10 mois #19717
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Retourner plusieurs valeurs dans une fonction
Riza écrit:
[code:1]
#Affiche la signature de la méthode
$process.Start
# OverloadDefinitions
#
# bool Start()
[/code:1]
Start émet un booléen.
Un comportement de base à connaitre.
Riza écrit:
Mais ceci pourrait l'émettre :
[code:1]
#les parenthèses force le parseur à émettre la valeur affectée à la variable $a dans le pipeline
($a=10)
#10
[/code:1]
A connaitre, mais à éviter à mon avis.
Riza écrit:
[code:1]
$process.WaitForExit
#OverloadDefinitions
#
#bool WaitForExit(int milliseconds)
#void WaitForExit()
[/code:1]
Ton code utilises la second qui n'émet donc aucune valeur dans le pipe.
Oui, car certaines méthodes renvoient un résultat, sans clause Return elles sont par défaut émisent dans le pipeline :Problème, quand je fais result.Count j'obtiens 3 !
Est-ce normal ?
[code:1]
#Affiche la signature de la méthode
$process.Start
# OverloadDefinitions
#
# bool Start()
[/code:1]
Start émet un booléen.
Un comportement de base à connaitre.
Riza écrit:
Non, c'est une propriété qui est affectée à la variable $Valeur.J'ai l'impression que c'est le exitcode
Mais ceci pourrait l'émettre :
[code:1]
#les parenthèses force le parseur à émettre la valeur affectée à la variable $a dans le pipeline
($a=10)
#10
[/code:1]
A connaitre, mais à éviter à mon avis.
Riza écrit:
Cela dépend de la signature que tu utilises :PS : J'avais oublié de dire que le WaitForExit renvoi un booléen
[code:1]
$process.WaitForExit
#OverloadDefinitions
#
#bool WaitForExit(int milliseconds)
#void WaitForExit()
[/code:1]
Ton code utilises la second qui n'émet donc aucune valeur dans le pipe.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.106 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Retourner plusieurs valeurs dans une fonction