2013-07-16 195 views
9

我想在腳本開始時刪除所有用戶創建的變量。powershell - 刪除所有變量

目前我在做Remove-Variable -Name *,但它也試圖刪除所有系統變量,導致很多錯誤消息。

還有其他方法嗎?

+1

爲什麼?這聽起來像是有一個更好的解決方案來解決你的底層問題 –

回答

-3

你不能。您必須在腳本啓動之前跟蹤可用變量,並刪除腳本執行後添加的所有變量。

0

我想你可以列出你不想刪除的所有變量。

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

然後刪除不在不刪除列表中的變量。

20

由於所有的系統變量只讀或常量反正你可以沉默的錯誤:

Remove-Variable * -ErrorAction SilentlyContinue 

但無可否認,你應該排除少數反正:

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

當你以admin身份運行Remove-Variable時,它將刪除那些只讀變量,所以它應該小心謹慎地完成,並且適當的照顧可能意味着不會使用Remove -Variable在所有:https://stackoverflow.com/questions/5666863/powershell-ise-cannot-start-after-foolishly-deleting-all-variables?rq=1 – music2myear

+0

@ music2myear:您的PowerShell會話是你的,管理員或不是無關緊要的。 – Joey

1

你應該不依賴於這些變量。任何沒有聲明的東西都沒有被使用。如果您需要傳遞信息,請使用參數。

如果你遵循這個原則,你只需要覆蓋你的用戶創建的變量,並使用它就像它從來沒有存在過。

0

這是一個破解這將刪除所有變量,除了在您的$配置文件中創建的變量。請注意,這需要幾秒鐘的時間才能完成,而且您可以更有效地實現最終目標。您必須調整select語句中的「15」以對應您的配置文件腳本吐出的行數。或者你可以修改它來從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}} 

警告:這並不會刪除通過PowerShell的創建變量主機指定加載模塊或執行的是創建變量腳本的InitialSessionState。然而,對於普通的Powershell和powershell_ise,你不必擔心這一點。

+0

這似乎過了工程 – TravisO

0

相反刪除所有用戶的變量,啓動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:\> 

用戶定義的變量將不會延續到新的實例。

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

PS C:\> 

您的變量也不會帶回到調用實例中。

對於如何實際完成此操作,您有幾個選項。

  1. 您可以隨時開始自己的新實例,當然:

    powershell -ExecutionPolicy Unrestricted -File myscript

  2. 你可以在一個單獨的腳本編碼命令,然後只調用腳本,並與沒有同伴一個真正的代碼。
0

我會拉現有變量名稱的列表到一個數組在腳本的開頭,然後在腳本的結尾處,刪除任何新添加的變量:

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