これはかなりカバーされていますが、欠けている重要な情報があります。うまくいけば、これがどのように機能するかを明確にして、疲れた旅行者にいくつかの安心を与えることができます。:-)
現在のプロセスから削除
言うまでもなく、現在のプロセスから環境変数を削除するには、次のようにするだけです。
set FOO=
永続的な削除
環境変数には、システム全体とユーザーの2つのセットがあります。
ユーザー環境変数を削除:
reg delete "HKCU\Environment" /v FOO /f
システム全体の環境変数を削除します。
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
再起動せずに値を適用
これが足りない魔法の情報です!これを行った後、新しいコマンドウィンドウを起動しても、環境変数がまだ残っているのはなぜでしょうか。その理由は、explorer.exeがその環境を更新していないためです。あるプロセスが別のプロセスを起動すると、新しいプロセスはそれを起動したプロセスから環境を継承します。
再起動せずにこれを修正するには2つの方法があります。最もブルートフォースな方法は、explorer.exeプロセスを強制終了して、もう一度起動することです。タスクマネージャーから実行できます。ただし、この方法はお勧めしません。
もう1つの方法は、explorer.exeに環境が変更され、環境を再読み取りするように指示することです。これは、Windowsメッセージ(WM_SETTINGCHANGE)をブロードキャストすることによって行われます。これは、簡単なPowerShellスクリプトで実行できます。あなたはこれを行うために簡単に書くことができますが、私はスクリプトによる変更後のウィンドウ設定の更新でそれを見つけました:
if (-not ("win32.nativemethods" -as [type])) {
add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
"@
}
$HWND_BROADCAST = [intptr]0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [uintptr]::zero
[win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,[uintptr]::Zero, "Environment", 2, 5000, [ref]$result);
概要
したがって、「FOO」という名前のユーザー環境変数を削除し、その後に起動するプロセスに変更を反映させるには、次のようにします。
- PowerShellスクリプトをファイルに保存します(これをupdateenv.ps1と呼びます)。
- これをコマンドラインから実行します。reg delete "HKCU \ Environment" / v FOO / f
- updateenv.ps1を実行します。
- コマンドプロンプトを閉じて再度開くと、環境変数が定義されていないことがわかります。
このスクリプトを実行できるようにするには、PowerShell設定を更新する必要がある可能性がありますが、それはGoogle-fuの演習のままにしておきます。