我想在脚本开头删除所有用户创建的变量。
目前我在做Remove-Variable -Name *
但是它也试图删除所有系统变量,导致大量错误消息。
还有其他方式吗?
答案 0 :(得分:24)
由于所有系统变量都是只读或常量,因此您可以将错误静音:
Remove-Variable * -ErrorAction SilentlyContinue
但诚然,你应该排除一些:
Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0
答案 1 :(得分:1)
你不应该依赖这些变量。任何未声明的内容都不会被使用。如果您需要传递信息,请使用参数。
如果你遵守这个原则,你只需覆盖用户创建的变量,并使用它从未存在过。
答案 2 :(得分:1)
调用PowerShell的新实例,获取内置变量,然后删除所有不属于该对象的东西。
$ps=[PowerShell]::Create()
$ps.AddScript('$null=$host;Get-Variable') > $null
$BuiltIn=$ps.Invoke()
$ps.Runspace.Close()
$ps.Dispose()
$BuiltIn | ForEach-Object { Remove-Variable -Name "$($_.Name)" }
答案 3 :(得分:0)
我想你可以列出你不想删除的所有变量。
$DontDelete = '$','?','^','args',...,'WhatIfPreference'
然后删除不在“不删除”列表中的变量。
答案 4 :(得分:0)
这是 hack ,它会删除除$ profile中创建的变量以外的所有变量。请注意,这需要几秒钟的时间才能运行,并且您很有可能以更有效的方式实现最终目标。您必须在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,你不必担心。
答案 5 :(得分: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:\>
您的变量也不会重新进入调用实例。
在如何实现这一目标方面,你有几个选择。
您总是可以自己启动新实例:
powershell -ExecutionPolicy Unrestricted -File myscript
答案 6 :(得分:0)
我会将现有变量名列表拉到脚本开头的数组中,然后删除脚本末尾的所有新添加的变量:
$(function () {
$('#container').highcharts({
title: {
text: 'Monthly Average Temperature',
x: -20 //center
},
subtitle: {
text: 'Source: WorldClimate.com',
x: -20
},
xAxis: {
type: 'datetime',
tickPositions: [1454329239000, 1465906839000, 1468844439000, 1469708439000, 1474892439000, 1476879639000, 1478607639000],
labels: {
style: {
fontSize: '0.75em'
},
formatter: function() {
return Highcharts.dateFormat('%b %e', this.value);
}
}
},
yAxis: {
title: {
text: 'Temperature (°C)'
},
plotLines: [{
value: 0,
width: 1,
color: '#808080'
}]
},
tooltip: {
valueSuffix: '°C'
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 0
},
series: [{
name: 'Tokyo',
data: [[1454329239000, 09], [1465906839000, 08], [1468844439000, 07], [1469708439000, 10], [1474892439000, 17], [1476879639000, 8], [1478607639000, 20]]
}]
});
});
答案 7 :(得分:0)
您还可以考虑更改变量的范围。例如,包含在循环或函数中的变量仅存在于该范围内。只要变量不是在全局或脚本范围内创建的,它们就不会在脚本完成后持续存在。然后您可以删除全局/脚本范围变量。 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.1
答案 8 :(得分:-3)
你做不到。您必须在脚本启动之前跟踪可用变量,并删除脚本执行后添加的所有变量。