2013-07-16 19 views
9

Desidero rimuovere tutte le variabili create dall'utente all'inizio di uno script.powershell - Rimuovi tutte le variabili

Attualmente sto facendo Remove-Variable -Name * ma tenta di eliminare anche tutte le variabili di sistema, risultando in molti messaggi di errore.

In nessun altro modo?

+1

Perché? Sembra che ci sia una soluzione migliore al tuo problema sottostante –

risposta

-3

Non è possibile. Dovrai tenere traccia delle variabili disponibili prima dell'avvio dello script e rimuovere eventuali variabili aggiunte dopo l'esecuzione dello script.

0

Suppongo che sia possibile creare un elenco di tutte le variabili che non si desidera eliminare.

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

Quindi eliminare le variabili che non si trovano nell'elenco Non eliminare.

20

Dato che tutte le variabili di sistema sono di sola lettura o costante in ogni caso si può solo tacere gli errori:

Remove-Variable * -ErrorAction SilentlyContinue 

Ma è vero, probabilmente si dovrebbe escludere un paio in ogni caso:

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

Quando esegui Remove-Variable come admin, rimuoverà anche quelle variabili di sola lettura, quindi dovrebbe essere fatto con cura, e la cura corretta probabilmente significherebbe non usare Remove -Variabile a tutti: https://stackoverflow.com/questions/5666863/powershell-ise-cannot-start-after-foolishly-deleting-all-variables?rq=1 – music2myear

+0

@ music2myear: la sessione di PowerShell è tua, amministratore o non è irrilevante. – Joey

1

Si dovrebbe non fare affidamento su quelle variabili. Tutto ciò che non è stato dichiarato non viene utilizzato. Se hai bisogno di passare le cose, usa i parametri.

Se rispetti questo principio, devi semplicemente sovrascrivere la tua variabile creata dall'utente e usarla come se non fosse mai esistita.

0

Questo è un mod che eliminerà tutte le variabili ad eccezione di quelle create nel tuo profilo $. Tieni presente che questa operazione richiede alcuni secondi e ci sono buone probabilità che tu possa raggiungere il tuo obiettivo finale in un modo più efficiente. Dovrai regolare il "15" nell'istruzione select in modo che corrisponda al numero di righe che il tuo script del profilo sputa. Oppure puoi modificarlo per cercare la prima riga da 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}} 

Avvertenza: questo non elimina le variabili create da PowerShell ospita che specificano un InitialSessionState che carica i moduli o esegue gli script che creano variabili. Comunque per Powershell e powershell_ise normali non devi preoccuparti di questo.

+0

Sembra sovradimensionato – TravisO

0

Invece di eliminare tutte le variabili utente, avviare un'istanza fresco di PowerShell: variabili definite

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

utente non verranno applicate nella nuova istanza.

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

PS C:\> 

Le variabili non torneranno all'istanza chiamante.

Hai alcune opzioni in termini di come farlo effettivamente.

  1. si può sempre iniziare la nuova istanza da soli, ovviamente:

    powershell -ExecutionPolicy Unrestricted -File myscript

  2. Si potrebbe codificare quel comando in uno script separato e quindi chiamare solo lo script, e non il compagno quello con il vero codice
0

vorrei tirare l'elenco dei nomi di variabili esistenti in un array, all'inizio dello script, quindi rimuovere tutte le variabili appena aggiunto alla fine dello 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!" 
 
    }

Problemi correlati