2013-07-16 127 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!" 
 
    }