Différence entre Clair-Variable et réglage de la variable à NULL
J'ai souvent utiliser des variables qui sont déclarées dans le script de portée pour éviter les problèmes avec des fonctions et de leurs champs d'application. Je suis de déclarer ces variables comme ceci:
New-Variable -Name test -Option AllScope -Value $null
... ou parfois je changer les variables de ce type à les utiliser de manière exhaustive:
$script:test = $test
Quand je veux les effacer je utiliser ce:
Clear-Variable test -Scope Script
... ou j'ai tout simplement utiliser ce:
$test = $null
Est-il une différence? Que dois-je préfère et pourquoi?
Vous devez vous connecter pour publier un commentaire.
De la get-Help:
Donc
Clear-Variable
et$var=$null
sont presque équivalents (à l'exception de la saisie, qui est conservé). Un équivalent exact serait de faire$var=[mytype]$null
.Vous pouvez tester vous-même:
Et de répondre à ce que peut être la question suivante: comment faire pour supprimer complètement une variable (depuis un absent variable est différente d'une valeur null variable)? Tout simplement
Remove-Variable
.Clear-Variable
et l'attribution$null
préserver le type, d'un type variable liée (une variable définie avec "cast notation"; par exemple,[int] $i = 1
).$null
préserve également des informations de type fortement typées variables; il peut apparaître différemment, simplement en raison de la portée. Voir mklement0 réponse de.Clear-Variable
.Pour compléter Marcanpilami de réponse utile:
Remarque: pour supprimer (destruction) d'une variable tout à fait, l'utilisation
Supprimer la Variable <nom> [-Champ <champ>]
.Sauf
$test
est défini avecSet-Variable -Option AllScope
,Clear-Variable test -Scope Script
et
$test = $null
sont généralement PAS d'équivalent.
(Avec
Set-Variable -Option AllScope
ils sont, mais alors le-Scope
argument devient hors de propos, car alors seulement un instance de la variable existe (conceptuellement), l'ensemble des étendues.)$test = $null
- à moins d'être exécuté dans le même champ d'application que lorsque la variabletest
a été créé à l'origine - sera implicitement créer untest
variable dans le actuel portée (et attribuer$null
à elle), et de laisser le original variable intacte. Pour en savoir plus sur la variable de portée dans PS, voir cette réponse de la mienne.Noter que variable syntaxe propose de portée trop, par l'intermédiaire d'un champ préfixe, mais il est limité à
global
,script
, etlocal
(par défaut):$global:test = $null
,$script:test = $null
,$local:test = $null
Il y a aussi le
private
portée: une variation delocal
qui empêche descendant étendues de voir une variable de nouveau, voir cette réponse.Si vous avez vérifié que vous sont le ciblage de la même portée, les deux formes ci-dessus sont fonctionnellement équivalents: ils attribuent
$null
à la variable cible.[1]Cependant, l'utilisation de
Clear-Variable
vous permet de faire deux choses qui$<scope>:testing = ...
n'est pas:la
-Scope
paramètre accepte également un numérique valeur qui indique la portée relative du champ d'application actuel:0
est la portée actuelle,1
est la portée parent, et ainsi de suite.vous pouvez cible plusieurs variables (soit comme tableau de noms ou à l'aide de jokers)
[1] Piège:
Noter que si la variable cible est type de contraintes (a été attribué à "cast notation"; par exemple,
[int] $i = 1
), le type est conservé - si l'utilisation de$testing = $null
ouClear-Variable
- et un implicite de conversion de type peut se produire, ce qui peut avoir des résultats inattendus ou l'échec tout à fait: