powershell - 删除所有变量

时间:2013-07-16 13:51:08

标签: variables powershell

我想在脚本开头删除所有用户创建的变量。

目前我在做Remove-Variable -Name *但是它也试图删除所有系统变量,导致大量错误消息。

还有其他方式吗?

9 个答案:

答案 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:\>

您的变量也不会重新进入调用实例。

在如何实现这一目标方面,你有几个选择。

  1. 您总是可以自己启动新实例:

    powershell -ExecutionPolicy Unrestricted -File myscript

  2. 您可以在单独的脚本中对该命令进行编码,然后只调用该脚本,而不是具有真实代码的伴随脚本。

答案 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)

你做不到。您必须在脚本启动之前跟踪可用变量,并删除脚本执行后添加的所有变量。