Je souhaite supprimer toutes les variables créées par l'utilisateur au début d'un script.
Actuellement, je suis en train de faire Remove-Variable -Name *
mais il essaie également de supprimer toutes les variables système, ce qui entraîne beaucoup de messages d'erreur.
Un autre moyen?
Toutes les variables système étant en lecture seule ou constantes, vous pouvez simplement faire taire les erreurs:
Remove-Variable * -ErrorAction SilentlyContinue
Mais certes, vous devriez probablement en exclure quelques-uns:
Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0
Appelez une nouvelle instance de PowerShell, récupérez les variables intégrées, puis supprimez tout le reste.
$ps=[PowerShell]::Create()
$ps.AddScript('$null=$Host;Get-Variable') > $null
$BuiltIn=$ps.Invoke()
$ps.Runspace.Close()
$ps.Dispose()
$BuiltIn | ForEach-Object { Remove-Variable -Name "$($_.Name)" }
Vous ne devriez pas compter sur ces variables. Tout ce qui n'a pas été déclaré n'est tout simplement pas utilisé. Si vous devez transmettre des informations, utilisez des paramètres.
Si vous respectez ce principe, écrasez simplement votre variable créée par l'utilisateur et utilisez-la comme si elle n'avait jamais existé.
Je suppose que vous pourriez faire une liste de toutes les variables que vous ne voulez pas supprimer.
$DontDelete = '$','?','^','args',...,'WhatIfPreference'
Supprimez ensuite les variables qui ne figurent pas dans la liste Ne pas supprimer.
Je voudrais tirer la liste des noms de variables existantes dans un tableau au début du script, puis supprimer toutes les variables nouvellement ajoutées à la fin du script:
### Start of script (store list of existing variable names)
$ExistingVariables = Get-Variable | Select-Object -ExpandProperty Name
<#
Script contents go here
#>
### End of script (remove new variables)
$NewVariables = Get-Variable | Select-Object -ExpandProperty Name | Where-Object {$ExistingVariables -notcontains $_ -and $_ -ne "ExistingVariables"}
if ($NewVariables)
{
Write-Host "Removing the following variables:`n`n$NewVariables"
Remove-Variable $NewVariables
}
else
{
Write-Host "No new variables to remove!"
}
Au lieu de supprimer toutes les variables utilisateur, démarrez une nouvelle instance de PowerShell:
PS C:\> $x = 10
PS C:\> $y = 50
PS C:\> $blah = 'text'
PS C:\> Write-Host $x $y $blah
10 50 text
PS C:\> powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
PS C:\> Write-Host $x $y $blah
PS C:\>
Les variables définies par l'utilisateur ne seront pas reportées dans la nouvelle instance.
PS C:\> $bleh = 'blue'
PS C:\> Write-Host $bleh
blue
PS C:\> exit
PS C:\> Write-Host $bleh
PS C:\>
Vos variables ne seront pas non plus reportées dans l'instance d'appel.
Vous avez quelques options pour savoir comment y parvenir.
Vous pouvez toujours démarrer la nouvelle instance vous-même, bien sûr:
powershell -ExecutionPolicy Unrestricted -File myscript
Voici un hack qui supprimera toutes les variables sauf celles créées dans votre profil $. Notez que cela prend quelques secondes à courir, et il y a de bonnes chances que vous puissiez atteindre votre objectif final de manière plus efficace. Vous devrez ajuster le "15" dans l'instruction select pour qu'il corresponde au nombre de lignes que votre script de profil recrache. Ou vous pouvez le modifier pour rechercher la première ligne de gv (get-variable).
$x=powershell -nologo -command "gv|out-string"
$y=($x|select -skip 15) -split "\s+",2
$varnames = $(for ($i=0;$i -lt $y.length; $i+=2) { $y[$i]})
rv i,x,y
gv | % {if ($varnames -notcontains $_.name) {rv $_.name -EA 0}}
Avertissement: cela ne supprimera pas les variables créées par les hôtes Powershell qui spécifient un InitialSessionState qui charge des modules ou exécute des scripts qui créent des variables. Cependant, pour Powershell et powershell_ise, vous n'avez pas à vous en préoccuper.