Question Retourner plusieurs valeurs dans une fonction

Plus d'informations
il y a 10 ans 10 mois #19724 par Laurent Dardenne
6ratgus écrit:

Au secours Laurent :

:ohmy:
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.

Plus d'informations
il y a 10 ans 10 mois #19725 par Philippe
après ici, dans ce cas, c'est pas vraiment un bug de powershell, mais plutôt une erreur de codage du script :

[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 :

Je ne connais pas tout.

Là je suis très déçus ;)

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

Plus d'informations
il y a 10 ans 10 mois #19728 par Laurent Dardenne
6ratgus écrit:

waitforexit renvoie rien et on renvoie ce rien via un return. Pour faire quoi, un if dessus ???

Par exemple.
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:

si tu a besoin d'aide pour les tests, je suis là !

Je posterais qq tests à confirmer.

Tutoriels PowerShell

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

Plus d'informations
il y a 10 ans 10 mois #19730 par Laurent Dardenne
Riza, quelle version de Powershell utilises-tu ?

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 :laugh:

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.

Plus d'informations
il y a 10 ans 10 mois #19732 par THIBURCE
Bonjour,

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.

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

Du coup voici ma fonction après correction :

Je ne comprend pas l'intérêt du While.

Riza écrit:

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é.

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.aspx
]event[/url].
Enfin la lecture de ExitCode peut lever une exception.
Riza écrit:

Ceci mériterais un nouveau topic je pense ^^

Je le pense aussi.

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.

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