我想在脚本开始时删除所有用户创建的变量。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!"
}
为什么?这听起来像是有一个更好的解决方案来解决你的底层问题 –