スクリプトの開始時にすべてのser-created変数を削除したい。
現在、Remove-Variable -Name *
ただし、すべてのシステム変数も削除しようとするため、多くのエラーメッセージが表示されます。
その他の方法で?
とにかくすべてのシステム変数は読み取り専用または定数であるため、エラーを黙らせることができます。
Remove-Variable * -ErrorAction SilentlyContinue
しかし、確かに、おそらくいくつかを除外する必要があります。
Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0
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)" }
これらの変数に依存しないでください。宣言されていないものは使用されません。物事をやり取りする必要がある場合は、パラメーターを使用します。
この原則を守れば、ユーザーが作成した変数を上書きし、存在しないように使用することになります。
削除したくないすべての変数のリストを作成できると思います。
$DontDelete = '$','?','^','args',...,'WhatIfPreference'
次に、[削除しない]リストにない変数を削除します。
スクリプトの最初に既存の変数名のリストを配列に入れ、スクリプトの最後に新しく追加された変数を削除します。
### 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!"
}
すべてのユーザー変数を削除する代わりに、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
以下は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}}
警告:これは、モジュールをロードする、または変数を作成するスクリプトを実行するInitialSessionStateを指定するPowershellホストによって作成された変数を削除しません。ただし、通常のPowershellとpowershell_iseについては、心配する必要はありません。