Question
Retourner plusieurs valeurs dans une fonction
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Au secours Laurent :
Je ne connais pas tout.
Je pense qu'il y a un bug, à moins que ce soit un point que je ne connais pas. En tout cas il y a bien un cas où le comportement diffère entre la v2 et la v4.
Cela nécessite de nombreux tests, je regarde ça ces prochains jours. Si tu les confirmes je demanderais via la mailinglist MVP ce qu'il en ait, si c'est un bug/breaking change l'équipe de dev, si elle a le temps, peut confirmer.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
[code:1]$timer = $process.WaitForExit()[/code:1]
waitforexit renvoie rien et on renvoie ce rien via un return. Pour faire quoi, un if dessus ???
mais peut être que dans une autre situation ça peut être fait volontairement !
si tu a besoin d'aide pour les tests, je suis là !
PS :
Là je suis très déçusJe ne connais pas tout.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Par exemple.waitforexit renvoie rien et on renvoie ce rien via un return. Pour faire quoi, un if dessus ???
Une fonction peut ne rien renvoyer, donc jusqu'à maintenant cela équivaut, selon le contexte, à la valeur $null.
Mais cela reste une information qui est différente par exemple d'un tableau vide, d'une chaine vide ou de zéro.
Pour le cas que tu rencontres, la valeur $null semble filtrer. Dans mon exemple j'ai utilisé directement la valeur $null qui dans ce cas a un autre comportement avec la V4.
6ratgus écrit:
Je posterais qq tests à confirmer.si tu a besoin d'aide pour les tests, je suis là !
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
6ratgus pour le test il faut utiliser l'opérateur -EQ et pas -Match, sinon cela fausse le résultat.
Voici qq test qui semble isoler le 'pb' .
Avant il faut savoir que $null est un valeur scalaire sous Powershell et le terme void est différent de $null :
[code:1]
$sb={
#$Result = @(Test)
$Result = Test
if ($Result.psbase -ne $null)
{
Write-Warning \"Result.Count=$($Result.count)\"
$result.gettype()
$result
}
else
{Write-Warning \"Result is Null\"}
}
function Test() {
function getNull {$Null} #or {'s' -as [int]}
$v=getNull
Write-warning \"`tV is null : $($V -eq $null) $((gv v).value -eq $null) $(!$v)\"
return $V,$false
#or return (gv V).value,$false
}
&$sb
#PS v4 and v2 return Result.Count =2
function Test() {
function getVoid {}
getVoid
return $false
}
&$sb
#PS v4 and v2 return Result.Count =1
function Test() {
function getVoid {}
$V=getVoid
#or $V=get-process -name NotExist -ea silentlycontinue
Write-warning \"`tV is null : $($V -eq $null) $((gv v).value -eq $null) $(!$v)\"
return $V,$false
}
&$sb
#Powershell -version 4 return Result.Count =1, but Powershell -version 2 return : Result.Count =2
#Bug ? Breaking Change, by design ?
function Test() {
function getVoid {}
getVoid
#Write-warning \"`tV is null : $($V -eq $null) $((gv v).value -eq $null) $(!$v)\"
# GV -> Write-Error :
# CategoryInfo: ObjectNotFound: (v:«»String) [Get-Variable], ItemNotFoundException
return $V,$false
}
&$sb
#PS v4 and v2 return Result.Count =2
#???
[/code:1]
Si cela vous semble confus, c'est normal vous êtes en train de faire du Powershell.
Les deux derniers exemples ne sont pas cohérent, sauf si on m'explique pourquoi ils le sont
Donc ceci, dans ma première réponse, ne concerne que la v2 :
Laurent Dardenne écrit:
Cet appel $process.WaitForExit() renvoi Void, c'est à dire $null qui n'est pas rien dans ton cas :
Et ce comportement n'est pas lié au return ou a une fonction, mais bien au pipeline :
[code:1]
\".dir\", $null, \".pdf\" | Foreach {\"Hello\"}
\".dir\", (&{$v}), \".pdf\" | Foreach {\"Hello\"}
\".dir\", (&{}), \".pdf\" | Foreach {\"Hello\"}
\".dir\", (&{$v=get-process -name NotExist -ea silentlycontinue;$v}), \".pdf\" | Foreach {\"Hello\"}
[/code:1]
Les deux derniers exemples différent entre la v4 et la v2.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- THIBURCE
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 17
- Remerciements reçus 0
J'ai la version 2.0.
Tu avais raison 6ratgus, le process.Start() renvoyait true que je croyais être mon timer hors mon timer renvoyait $null comme le disait Laurent.
Du coup voici ma fonction après correction :
[code:1]function decryptFichier($fichier, $password, $fichierDecrypt, $timeout)
{
$erreur = $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\"
$processStart = $process.Start()
$timer = $process.WaitForExit($timeout)
$valeur = $process.ExitCode
while($timer)
{
break
}
}
catch
{
write-host \"Erreur de décryptage: $_\"
$erreur = $true
}
return $valeur, $erreur
}[/code:1]
Comme je veux vérifier $timer je lui renseigne un temps en fonction de la taille de mon fichier pour savoir quand l'exécutable a terminé.
Dernier problème, comment récupérer ce que renvoi mon exécutable.
Je ne sais pas pourquoi mais avant cela fonctionnait en faisant exactement la même chose hors maintenant $valeur est à 0 quand l'exécution fonctionne.
Comment faire pour récupérer la valeur retournée et les erreurs générées par un exécutable ?
Ceci mériterais un nouveau topic je pense ^^
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Je ne comprend pas l'intérêt du While.Du coup voici ma fonction après correction :
Riza écrit:
En théorie il peut ne pas être terminé une fois le délai d'attente passé. Et le 'quand' me fait penser à un [url=https://msdn.microsoft.com/fr-fr/library/system.diagnostics.process.exited%28v=vs.80%29.aspxComme je veux vérifier $timer je lui renseigne un temps en fonction de la taille de mon fichier pour savoir quand l'exécutable a terminé.
]event[/url].
Enfin la lecture de ExitCode peut lever une exception.
Riza écrit:
Je le pense aussi.Ceci mériterais un nouveau topic je pense ^^
Pour en revenir au pb rencontré avec la v4 voir aussi ceci , spécifique aux versions supérieures ou égales à la 3 (à confirmer).
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Retourner plusieurs valeurs dans une fonction