Powershell - удалить все переменные

Я хочу удалить все созданные пользователем переменные в начале script.

В настоящее время я выполняю Remove-Variable -Name *, но он также пытается удалить все системные переменные, что приводит к множеству сообщений об ошибках.

Любой другой способ?

Ответ 1

Поскольку все системные переменные доступны только для чтения или постоянны, вы можете просто отключить ошибки:

Remove-Variable * -ErrorAction SilentlyContinue

Но, по общему признанию, вы должны, вероятно, исключить несколько:

Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0

Ответ 2

Вызвать новый экземпляр PowerShell, получить встроенные переменные, а затем удалить все остальное, что не принадлежит.

$ps = [PowerShell]::Create()
$ps.AddScript('Get-Variable | Select-Object -ExpandProperty Name') | Out-Null
$builtIn = $ps.Invoke()
$ps.Dispose()
$builtIn += "profile","psISE","psUnsupportedConsoleApplications" # keep some ISE-specific stuff

Remove-Variable (Get-Variable | Select-Object -ExpandProperty Name | Where-Object {$builtIn -NotContains $_})

Ответ 3

Вы не должны полагаться на эти переменные. Все, что не было объявлено, просто не используется. Если вам нужно пройти все вокруг, используйте параметры.

Если вы придерживаетесь этого принципа, вы просто перезапишите созданную пользователем переменную и будете использовать ее так, как она никогда не существовала.

Ответ 4

Я полагаю, вы могли бы составить список всех переменных, которые вы не хотите удалять.

$DontDelete = '$','?','^','args',...,'WhatIfPreference'

Затем удалите переменные, которые не находятся в списке Do not Delete.

Ответ 5

Вот hack, который удалит все переменные, кроме тех, которые созданы в вашем профиле $. Обратите внимание, что для запуска требуется несколько секунд, и есть довольно хороший шанс, что вы сможете достичь своей конечной цели более эффективным способом. Вам нужно будет отрегулировать "15" в операторе select, чтобы соответствовать количеству строк, которые выдает ваш профиль script. Или вы можете изменить его для поиска первой строки из 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 вам не нужно беспокоиться об этом.

Ответ 6

Вместо того, чтобы удалять все пользовательские переменные, запустите новый экземпляр 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

  • Вы можете закодировать эту команду в отдельном script, а затем вызвать только script, а не компаньон с реальным кодом.

Ответ 7

Я бы вытащил список существующих имен переменных в массив в начале script, а затем удалял все новые добавленные переменные в конце script:

### 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!"
    }

Ответ 8

Вы не можете. Вам нужно будет отслеживать доступные переменные перед запуском script и удалять любые переменные, добавленные после выполнения script.