2013-07-16 12 views
9

Ich möchte alle benutzerdefinierten Variablen am Anfang eines Skripts entfernen.Powershell - Entfernen Sie alle Variablen

Momentan mache ich Remove-Variable -Name *, aber es versucht auch alle Systemvariablen zu löschen, was zu vielen Fehlermeldungen führt.

Irgendein anderer Weg?

+1

Warum? Es scheint, als gäbe es eine bessere Lösung für Ihr zugrunde liegendes Problem. –

Antwort

-3

Sie können nicht. Sie müssen die verfügbaren Variablen verfolgen, bevor das Skript gestartet wird, und alle Variablen entfernen, die nach der Ausführung des Skripts hinzugefügt wurden.

0

Ich nehme an, Sie könnten eine Liste aller Variablen erstellen, die Sie nicht löschen möchten.

$DontDelete = '$','?','^','args',...,'WhatIfPreference' 

Löschen Sie dann die Variablen, die nicht in der Liste Nicht löschen enthalten sind.

20

Da alle Systemvariablen sind schreibgeschützt oder konstant sowieso können Sie zum Schweigen bringen nur die Fehler:

Remove-Variable * -ErrorAction SilentlyContinue 

Aber zugegebenermaßen, sollten Sie vielleicht ein paar ausschließen sowieso:

Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0 
+0

Wenn Sie Remove-Variable als admin ausführen, werden auch diese schreibgeschützten Variablen entfernt. Es sollte also mit Vorsicht ausgeführt werden, und eine korrekte Pflege würde wahrscheinlich bedeuten, Remove nicht zu verwenden -Variable überhaupt: https://stackoverflow.com/questions/5666863/powershell -ise-cannot-start-after-foolishly-deleting-all-variables?rq=1 – music2myear

+0

@ music2myear: Ihre PowerShell Sitzung ist deins, admin oder ist nicht irrelevant. – Joey

1

Sie sollten sich nicht auf diese Variablen verlassen. Alles was nicht deklariert wurde, wird nicht benutzt. Wenn Sie Dinge weitergeben müssen, verwenden Sie Parameter.

Wenn Sie an diesem Prinzip festhalten, überschreiben Sie einfach Ihre vom Benutzer erstellte Variable und verwenden sie wie nie zuvor.

0

Hier ist ein hack, der alle Variablen außer denen in Ihrem $ Profil erstellt. Beachten Sie, dass dies ein paar Sekunden dauert, und es besteht eine gute Chance, dass Sie Ihr Endziel auf effizientere Weise erreichen können. Sie müssen die "15" in der SELECT-Anweisung so anpassen, dass sie der Anzahl der Zeilen entspricht, die Ihr Profilskript ausgibt. Oder Sie könnten es ändern, um nach der ersten Zeile von gv (get-variable) zu suchen.

$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}} 

Caveat: dies wird nicht Variablen, die von Powershell erstellt löschen Hosts, die eine InitialSessionState angeben, die Module oder führt Scripts lädt, die Variablen zu erstellen. Für normale Powershell und powershell_ise müssen Sie sich jedoch keine Sorgen machen.

+0

Dies scheint überentwickelt – TravisO

0

Statt alle Benutzervariablen zu löschen, eine neue Instanz von Powershell starten:

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

Benutzerdefinierte Variablen wird nicht in die neue Instanz tragen.

PS C:\> $bleh = 'blue' 
PS C:\> Write-Host $bleh 
blue 
PS C:\> exit 
PS C:\> Write-host $bleh 

PS C:\> 

Ihre Variablen werden auch nicht in die aufrufende Instanz zurückübertragen.

Sie haben einige Optionen, wie Sie dies tatsächlich erreichen können.

  1. Sie können jederzeit die neue Instanz starten selbst, natürlich:

    powershell -ExecutionPolicy Unrestricted -File myscript

  2. Sie diesen Befehl in einem separaten Skript kodieren könnten und dann nur das Skript aufrufen, und nicht den Begleiter eines mit der echte Code.
0

ich am Anfang des Skripts die Liste der vorhandenen Variablennamen in einem Array ziehen würde, dann entfernen Sie alle neu am Ende des Skripts hinzugefügt Variablen:

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

Verwandte Themen