スクリプトの開始時に、ユーザーが作成したすべての変数を削除したいと考えています。
現在私はやってRemove-Variable -Name *
いますが、すべてのシステム変数も削除しようとするため、多くのエラーメッセージが表示されます。
その他の方法で?
スクリプトの開始時に、ユーザーが作成したすべての変数を削除したいと考えています。
現在私はやってRemove-Variable -Name *
いますが、すべてのシステム変数も削除しようとするため、多くのエラーメッセージが表示されます。
その他の方法で?
$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 については、そのことを心配する必要はありません。
これらの変数に依存するべきではありません。宣言されていないものは使用されません。何かを渡す必要がある場合は、パラメーターを使用します。
この原則に従えば、ユーザーが作成した変数を上書きして、存在しなかったかのように使用できます。
これは、スクリプトを無限にスケーリングできるエンタープライズ向けのベスト プラクティスです。Powershell だけでなく、Javascript などのグローバル変数を持つ可能性のあるすべての言語で。
スクリプトの先頭で既存の変数名のリストを配列に取得し、スクリプトの最後で新しく追加された変数を削除します。
### 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!"
}
変数のスコープを変更することも検討できます。たとえば、ループまたは関数内に含まれる変数は、そのスコープ内にのみ存在します。変数がグローバル スコープまたはスクリプト スコープ内で作成されない限り、スクリプトの終了後も変数は保持されません。その後、グローバル / スクリプト スコープ変数を削除するだけです。https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_scopes?view=powershell-7.1
削除したくないすべての変数のリストを作成できると思います。
$DontDelete = '$','?','^','args',...,'WhatIfPreference'
次に、[削除しない] リストにない変数を削除します。
できません。スクリプトを開始する前に使用可能な変数を追跡し、スクリプトの実行後に追加された変数を削除する必要があります。