我想在腳本開始時刪除所有用戶創建的變量。powershell - 刪除所有變量
目前我在做Remove-Variable -Name *
,但它也試圖刪除所有系統變量,導致很多錯誤消息。
還有其他方法嗎?
我想在腳本開始時刪除所有用戶創建的變量。powershell - 刪除所有變量
目前我在做Remove-Variable -Name *
,但它也試圖刪除所有系統變量,導致很多錯誤消息。
還有其他方法嗎?
你不能。您必須在腳本啓動之前跟蹤可用變量,並刪除腳本執行後添加的所有變量。
我想你可以列出你不想刪除的所有變量。
$DontDelete = '$','?','^','args',...,'WhatIfPreference'
然後刪除不在不刪除列表中的變量。
由於所有的系統變量只讀或常量反正你可以沉默的錯誤:
Remove-Variable * -ErrorAction SilentlyContinue
但無可否認,你應該排除少數反正:
Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0
當你以admin身份運行Remove-Variable時,它將刪除那些只讀變量,所以它應該小心謹慎地完成,並且適當的照顧可能意味着不會使用Remove -Variable在所有:https://stackoverflow.com/questions/5666863/powershell-ise-cannot-start-after-foolishly-deleting-all-variables?rq=1 – music2myear
@ music2myear:您的PowerShell會話是你的,管理員或不是無關緊要的。 – Joey
你應該不依賴於這些變量。任何沒有聲明的東西都沒有被使用。如果您需要傳遞信息,請使用參數。
如果你遵循這個原則,你只需要覆蓋你的用戶創建的變量,並使用它就像它從來沒有存在過。
這是一個破解這將刪除所有變量,除了在您的$配置文件中創建的變量。請注意,這需要幾秒鐘的時間才能完成,而且您可以更有效地實現最終目標。您必須調整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,你不必擔心這一點。
這似乎過了工程 – TravisO
相反刪除所有用戶的變量,啓動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:\>
您的變量也不會帶回到調用實例中。
對於如何實際完成此操作,您有幾個選項。
您可以隨時開始自己的新實例,當然:
powershell -ExecutionPolicy Unrestricted -File myscript
我會拉現有變量名稱的列表到一個數組在腳本的開頭,然後在腳本的結尾處,刪除任何新添加的變量:
### 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!"
}
爲什麼?這聽起來像是有一個更好的解決方案來解決你的底層問題 –