Question Retourner plusieurs valeurs dans une fonction

Plus d'informations
il y a 10 ans 10 mois #19696 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 :D

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

Plus d'informations
il y a 10 ans 10 mois #19697 par Laurent Dardenne
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]

Tutoriels PowerShell

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

Plus d'informations
il y a 10 ans 10 mois #19698 par Laurent Dardenne
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]

Tutoriels PowerShell

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

Plus d'informations
il y a 10 ans 10 mois #19714 par THIBURCE
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

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

Plus d'informations
il y a 10 ans 10 mois #19716 par Philippe
bonjour Riza

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

Ce qui je pense est lié au fait que j'ai 3 valeurs dans result.

tu utilise la version 2 de Powershell
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 \&quot;espace\&quot; 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.

Plus d'informations
il y a 10 ans 10 mois #19717 par Laurent Dardenne
Riza écrit:

Problème, quand je fais result.Count j'obtiens 3 !
Est-ce normal ?

Oui, car certaines méthodes renvoient un résultat, sans clause Return elles sont par défaut émisent dans le pipeline :
[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:

J'ai l'impression que c'est le exitcode

Non, c'est une propriété qui est affectée à la variable $Valeur.
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:

PS : J'avais oublié de dire que le WaitForExit renvoi un booléen

Cela dépend de la signature que tu utilises :
[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.105 secondes
Propulsé par Kunena