Windowsにはsetx
コマンドがあります
Description:
Creates or modifies environment variables in the user or system
environment.
だから、あなたはこのような変数を設定することができます
setx FOOBAR 1
そして、あなたはこのような価値をクリアすることができます
setx FOOBAR ""
ただし、変数は削除されず、レジストリに残ります。
それでは、どのように実際に変数を削除しますか?
現在の環境から変数を削除するには(しないでを永久に):
set FOOBAR=
ser環境から変数を永久的に削除するには(これがデフォルトの場所であるsetx
に置かれます)。
REG delete HKCU\Environment /F /V FOOBAR
変数がsystem環境に設定されている場合(たとえば、最初にsetx /M
を使用して設定されている場合)、管理者として次のコマンドを実行します。
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
注:上記のREG
コマンドは、既存のプロセス(および既存のプロセスから分岐されたいくつかの新しいプロセス)には影響しません。したがって、変更をすぐに有効にすることが重要な場合は、ログアウトして再度ログインするか再起動します。
永久に削除せずに現在のコマンドセッションから変数を削除するには、通常の組み込みのset
コマンドを使用します。等号の後には何も入れないでください。
set FOOBAR=
確認するには、引数なしでset
を実行し、現在の環境を確認します。変数はリストから完全に欠けているはずです。
注:これは現在の環境から変数を削除するだけです - それレジストリへの変更を保持しません。新しいコマンドプロセスが開始されると、変数は元に戻ります。
これはかなりカバーされていますが、欠けている重要な情報があります。うまくいけば、私はこれがどのように機能するかを明確にし、疲れた旅行者にいくらかの安心を与えるのを助けることができます。 :-)
現在のプロセスから削除
明らかに、あなたは現在のプロセスから環境変数を削除するためだけにこれを行うことを誰もが知っています:
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スクリプトで実現できます。あなたは簡単にこれをするためにそれを書くことができました、しかし、私はここでそれを見つけました: https://www.angryadmin.co.uk/?tag=wm_settingchange 。
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設定を更新する必要がありますが、私はそれをGoogle-Fooの練習として残します。 。
CupawnTaeに同意します。
SET
は、マスター環境への変更には役立ちません。
参考:システム変数はHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
にあります(ユーザーvarsよりかなり長い)。
したがって、FOOBARという名前のシステム変数のフルコマンドは次のとおりです。REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
(スペースを処理するために必要な引用符に注意してください)
残念ながら、setx
コマンドは削除構文をサポートしていません。 :(
シモンズ:責任を持って使う - あなたがあなたのパス変数を殺したとしても、私を責めないでください!
上記のコマンドは機能しませんでしたが、これはしました:
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v FOOBAR /f
ショートカットHKLM
はHKEY_LOCAL_MACHINE
に使用できます。
PowerShellから、.NET [System.Environment]::SetEnvironmentVariable()
メソッドを使用できます。
に user 環境変数をFOO
という名前で削除します。
[Environment]::SetEnvironmentVariable('FOO', $null, 'User')
技術的には$null
を渡すのと実質的に同じですが、''
は意図をより適切に remove 変数に知らせるために使用されることに注意してください。
を削除するには system (マシンレベル)環境変数FOO
- には昇格が必要です(管理者として実行する必要があります):
[Environment]::SetEnvironmentVariable('FOO', $null, 'Machine')
より速い実行の他に、 reg.exe
ベースのメソッド を超える利点は、他のアプリケーションがWM_SETTINGCHANGE
メッセージを介しての変更を通知されることです(すべてのアプリケーションが聞くことはできません)そのメッセージ)。
setx FOOBAR ""はFOOBARの値をNULL文字列にするだけです。 (ただし、setコマンドで ""を使って表示されているので、二重引用符で囲まれている可能性があります。
私は使った:set FOOBAR =
fOOBARはsetコマンドにリストされなくなりました。 (ログオフ不要)
Win7 32ビット、コマンドプロンプトを使用して、非管理者は私が使用したものです。 (cmdやWindows-rではなく、違うかもしれません。)
ところで、私はそれを作成した後、私は私がレジストリのどこかに作成した変数を見ませんでした。管理者としてではなくregeditを使用しています。
小さなVBSスクリプトを作成することもできます。
Set env = CreateObject("WScript.Shell").Environment("System")
If env(WScript.Arguments(0)) <> vbNullString Then env.Remove WScript.Arguments(0)
それから%windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR
のようにそれを呼び出します
欠点は、追加のスクリプトが必要ですが、再起動が必要ないことです。