web-dev-qa-db-fra.com

powershell - Supprimer toutes les variables

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?

12
Ammar

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
23
Joey

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

1
Neolisk

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.

0
E.V.I.L.

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!"
    }

0
ferrell_io

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.

  1. Vous pouvez toujours démarrer la nouvelle instance vous-même, bien sûr:

    powershell -ExecutionPolicy Unrestricted -File myscript

  2. Vous pouvez coder cette commande dans un script séparé, puis appeler uniquement ce script, et non celui associé au code réel.
0
jpmc26

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.

0
Χpẘ