Question Ma variable s'efface quand je quitte la fonction

Plus d'informations
il y a 11 ans 7 mois #17899 par freeman62
Bonjour,

Ma variable s'efface quand je quitte la fonction.
Peut-être est-ce un comportement normal mais dans ce cas comment la conservée ?

Exemple :

Code :
[code:1]
function cool
{
$var=5
write-host \"fonction ma var = $var\"
return
}


$var=1
write-host \"début du script ma var = $var\"
COOL

write-host \"fin du script ma var = $var\"
[/code:1]

Résultat affiché :
[code:1]
début du script ma var = 1
fonction ma var = 5
fin du script ma var = 1
[/code:1]

Pourquoi il me retourne 1 en fin de script alors que j'aurais souhaité conservé 5 ? A aucun moment je la réinitialise à 1, pour moi il est pas sensé repassé par la case d'init à 1.

Je vous remercie :)

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

Plus d'informations
il y a 11 ans 7 mois #17901 par Laurent Dardenne
Salut,
freeman62 écrit:

Ma variable s'efface quand je quitte la fonction.

Ta variable est recréée dans la fonction, c'est le comportement des portées (scope) de Powershell.

Si tu changes l'affichage :
[code:1]
function cool
{
$var=5
write-host \"fonction ma var = $var\"
return
}

function cool2
{
write-host \"fonction2 ma var = $var\"
$var=5
write-host \"New variable : fonction2 ma var = $var\"
return
}

$var=1
write-host \"début du script ma var = $var\"
COOL
write-host \"fin du script ma var = $var\"

write-host \"début du script2 ma var = $var\"
COOL2
write-host \"fin du script2 ma var = $var\"
[/code:1]
Dans ce cas, le premier appel à Write-Host de la fonction Cool2, recherche la variable dans la portée de l’appelant, car var n'existe pas dans le portée courante (la nouvelle, celle de la fonction).

Sous PS,l'instruction $var=5 dans la fonction Cool2 crée une nouvelle variable, celle dans l'appelant existe tjrs.
En fin d'appel de la fonction la variable $var=5 n'existe plus, PS quitte la fonction et se retrouve dans le contexte initiale, $var=1.

On référence bien un même nom de variable, mais elle ne pointe pas sur la même 'adresse mémoire')

Un lien +- lié avec qq schémas :
www.liafa.jussieu.fr/~hf/verif/ens/cours/C++/node17.html

et aussi :
[code:1]Get-Help about_scope|more[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 7 mois #17912 par freeman62
Merci Laurent, grâce à tes explications et la commande que tu m'a fournie, j'ai bien compris le principe !

J'ai donc utilisé ce dont j'avais besoin,
exemple :
[code:1]
$SCRIPT:var=1
[/code:1]
Ainsi ma variable est utilisable dans tout mon script.

Juste une question complémentaire, je n'en n'ai pas besoin mais c'est pour comprendre :)
J'ai vu qu'il y avait aussi des variables de portées GLOBALES, c'est à dire utilisable dans tout le système.
J'ai voulu en initialiser une, cela fonctionne mais elle n'est pas conservée lorsque je relance un powershell.

Merci encore.

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

Plus d'informations
il y a 11 ans 7 mois #17914 par Laurent Dardenne
freeman62 écrit:

J'ai voulu en initialiser une, cela fonctionne mais elle n'est pas conservée lorsque je relance un powershell.

Sa durée de vie est celle de la session.
Pour la persistance utilise Export-CliXML & Import-CliXML.
A gérer dans le profile utilisateur par exemple ou dans une clé de registre...

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 7 mois #17932 par freeman62
Ok mais alors quelle est la différence entre une variable de type GLOBAL et une variable de type SCRIPT ?
\"La même session\" c'est un peu la même chose ?

Certainement une nuance qui m'échappe...

Merci :)

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

Plus d'informations
il y a 11 ans 7 mois #17933 par Laurent Dardenne
freeman62 écrit:

Certainement une nuance qui m'échappe...

Chaque exécution de code (fonction,script,module, scriptblock) créer une nouvelle portée ( dans la même session. Un job crée une autre session PS). Script: est utilisé dans un script afin de préciser que la portée de la variable est celle du script en cours.
Pour celle Global:, la variable existe tjr une fois le script terminé ou relancé :
[code:1]
#créer un script et y coller ce code
if (-not (test-path Variable:«»script:varScriptScope) )
{$script:varScriptScope=1}
else {$script:varScriptScope++}
if (-not (test-path Variable:global:varGlobalScope) )
{ $global:varGlobalScope=10 }
else { $global:varGlobalScope +=10 }

function inc { $script:varScriptScope++}
function inc2 { $varScriptScope++}

Write-host \"varScriptScope=$script:varScriptScope`t varGlobalScope=$global:varGlobalScope\"

inc
Write-host \"Premier increment : varScriptScope=$script:varScriptScope`t varGlobalScope=$global:varGlobalScope\"

inc2
Write-host \"Second increment : varScriptScope=$script:varScriptScope`t varGlobalScope=$global:varGlobalScope\"
[/code:1]
A la fin de la première exécution du script, varGlobalScope existera tjr dans toutes les portées [code:1]
$varGlobalScope
$global:varGlobalScope

rv varGlobalScope
rv varGlobalScope -Scope global
[/code:1]
Il faut passer un peu de temps sur ce point et construire de nombreux scénarios simple pour comprendre les bases, sinon ce sera séance de Debug à tout heure :)

Tutoriels PowerShell

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

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