OSレベルの構成から環境変数を削除するコマンドライン


182

Windowsには次のsetxコマンドがあります。

Description:
    Creates or modifies environment variables in the user or system
    environment.

したがって、次のように変数を設定できます。

setx FOOBAR 1

そして、あなたはこのように値をクリアすることができます:

setx FOOBAR ""

ただし、変数は削除されません。それはレジストリに残ります:

フーバー

では、実際にどのように変数を削除しますか?


3
setxは変数を設定するだけです。あなたはその行でそれをブランクにしているだけです。
Fox Wilson


かなりの量の調査が必要だったので、コマンドライン以外のオプションについては、superuser.com / q / 297947/46834も参照してください。
ゲイリー

回答:


216

現在の環境から変数を削除するには(永続的ではありません):

set FOOBAR=

変数をユーザー環境から永久に削除するには(デフォルトの場所setxはそれを配置します):

REG delete HKCU\Environment /F /V FOOBAR

変数がシステム環境で設定されている場合(たとえば、最初にで設定した場合setx /M)、管理者として実行します。

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

注:上記のREGコマンドは既存のプロセス(および既存のプロセスから分岐された一部の新しいプロセス)に影響を与えないため、変更をすぐに有効にすることが重要な場合は、ログアウトしてから再度ログインするのが最も簡単で確実な方法です。または再起動します。これがオプションではない場合、またはさらに掘り下げたい場合は、ここでの他の回答のいくつかに、ユースケースに適したいくつかの素晴らしい提案があります。


1
このソリューションは機能していないようです。または、基本的なことを誤解しています。しますsetx JUNK Hello。新しいコマンドを開きます。入力echo %JUNK%して取得しHelloます。その後、私はそうしREG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNK、値がレジストリからなくなっていることを確認します。私は新しいcmdを開いて入力しecho %JUNK%、それでも取得しHelloます。レジストリを検索すると、「JUNK」の存在は示されません。再起動が必要だと言わないでください!
caasjj 2016

返信いただきありがとうございます。[スタート]メニューから新しいコマンドウィンドウを開きます。コマンドの両方のバージョンを試しました。実際、初めてuser環境コマンドを入力すると、成功します。次に、コマンドを再入力すると、が表示されますThe system was unable to find the specified registry or key value。また、JUNKレジストリでのグローバル検索ではregedit何も見つかりません。それでも、新しいコマンドウィンドウを開き([スタート] / [アクセサリ]または[ファイル名を指定して実行]を使用)、「」と入力してecho %JUNK%も、値はそのまま残ります。
caasjj 2016

1
ああ!そのための合理性は何だと思いますか?私は常にadminをできる限り避けています-UNIX / BSD / Linuxの育成。素晴らしい勤勉さをミルに感謝します。+1
caasjj 2016

4
多分それは単なる意味論ですが、(レジストリからの)削除はすぐに有効になります。再度ログインするまで、環境はレジストリから再初期化されません。2つのコマンドを組み合わせて現在の環境から削除し(SET次のコマンドシェルのリストから削除する)、レジストリから削除できます。例:SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
Luke

1
再起動しないと環境が更新されないように見える理由は、explorer.exeが更新されたことを認識していないためです。詳細な説明と解決策については、私の回答を参照してください。
ジェイミー

72

変数を永久に削除せずに現在のコマンドセッションから削除するには、通常の組み込みsetコマンドを使用します。等号の後には何も入力しません。

set FOOBAR=

確認するには、set引数なしで実行し、現在の環境を確認します。変数はリストから完全に欠落しているはずです。

:これにより、現在の環境から変数が削除されるだけです -レジストリへの変更は保持されません。新しいコマンドプロセスが開始されると、変数は元に戻ります。


77
これは間違いなく答えではありません、そして私は非常に多くの賛成票があることを不安に思っています。これは、現在のコマンドセッションでのみ有効です。新しいコマンドウィンドウをクランクアップすると、変数が戻ります。
joescii 14

6
@joescii意外と思いますか?これは質問のタイトルの質問に答えました。したがって、質問のタイトルはより具体的にする必要があります。
2014年

10
@oberliesこれはOSレベルでは機能せず、現在のコマンドウィンドウでのみ機能するため、タイトルの質問に回答することに同意しません。第二に、あなたの主張は、質問の詳細部分は無関係であることを示唆しています。
joescii

3
@oberlies残念ながら編集はうまくいっていないようです-それはまだ賛成票を得ています。実際の質問に答えられなくても、人々はそれが役に立つと思うでしょう。少なくともそれは受け入れられるものとしてマークされていません、それは誤解を招くでしょう。
CupawnTae 2015年

3
私が反対票を投じた理由をコメントすることになっています。これは現在のセッションでのみ機能するためです。
Ian Grainger、2016

22

これはかなりカバーされていますが、欠けている重要な情報があります。うまくいけば、これがどのように機能するかを明確にして、疲れた旅行者にいくつかの安心を与えることができます。:-)

現在のプロセスから削除

言うまでもなく、現在のプロセスから環境変数を削除するには、次のようにするだけです。

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」という名前のユーザー環境変数を削除し、その後に起動するプロセスに変更を反映させるには、次のようにします。

  1. PowerShellスクリプトをファイルに保存します(これをupdateenv.ps1と呼びます)。
  2. これをコマンドラインから実行します。reg delete "HKCU \ Environment" / v FOO / f
  3. updateenv.ps1を実行します。
  4. コマンドプロンプトを閉じて再度開くと、環境変数が定義されていないことがわかります。

このスクリプトを実行できるようにするには、PowerShell設定を更新する必要がある可能性がありますが、それはGoogle-fuの演習のままにしておきます。


エクスプローラーを強制終了して再起動することを推奨しない特別な理由はありますか?私はいつもそれをします。
プロメテウス

さて、最初に頭に浮かぶ2つがあります。1つ目は、強制終了プロセスがメモリリークを引き起こす可能性があることです。はい、プロセスはサンドボックスであると想定されていますが、Windowsタスクマネージャーでさえ、これを軽く行わないように警告しています。他のより個人的な理由は私のOCDです。エクスプローラーを強制終了して再起動すると、タスクバーのすべてのアイコン(1つをクリックしたときの重複を含む)が再配置されます。私は自分のアイコンが開いた順に並んでいるのが好きです
ジェイミー

1
ワオ。私が探していた魔法のコマンドはsource .bashrc、Windowsで(またはそのいとこ)のように動作します。これは、「refer-to-this」行の先頭に移動します。
bballdave025

18

PowerShellから.NET [System.Environment]::SetEnvironmentVariable()メソッドを使用できます。

  • という名前のユーザー環境変数削除するにはFOO

    [Environment]::SetEnvironmentVariable('FOO', $null, 'User')
    

注意$nullする意図良好な信号に使用される除去技術が効果的に渡すのと同じであるが、変数を''この場合には。

  • するには取り外しシステム(マシンレベル)環境変数の名前をFOO- 昇格が必要(管理者として実行する必要があります):

    [Environment]::SetEnvironmentVariable('FOO', $null, 'Machine')
    

より高速な実行とは別に、reg.exeベースの方法よりも優れている点は、他のアプリケーションがWM_SETTINGCHANGEメッセージを介して変更を通知されることです(ただし、すべてのアプリケーションがそのメッセージをリッスンするわけではありません)。


2
これがここでの最良の答えです。
James

1
この方法では、再起動する必要がありません。なんてエレガントなソリューションでしょう!
jyao

13

CupawnTaeに同意します

SET マスター環境の変更には役立ちません。

参考:システム変数はHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment(ユーザー変数よりかなり長い)です。

したがって、FOOBARというシステム変数の完全なコマンドは次のとおりです。

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

(スペースを処理するために必要な引用符に注意してください。)

それはあまりにも悪いです setxコマンドが削除構文をサポートしていないのです。:(

PS:責任を持って使用してください-パス変数を削除しても、私を責めないでください!


元の質問で明示的に言及されている@CMCDragonkai-レジストリエントリは削除されず、空白になるだけです。実際の質問は、レジストリから削除する方法です
CupawnTae 2015年

1
これを有効にするには、cmdの再起動/更新が必要になる可能性があることを追加します。
jiggunjer 2015年

@jiggunjer、更新するには?
パセリエ2017

@Pacerierは新しいターミナルを開きます。
jiggunjer 2017

11

DougWareの回答のコマンドは機能しませんでしたが、これは機能しました。

reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v FOOBAR /f

ショートカットHKLMはに使用できますHKEY_LOCAL_MACHINE


1
また、ユーザー環境変数は「HKCU \ Environment」の下にあります
tzrlk

1
@Tzrlk、不一致の理由は何ですか?HKLM \ Environmentにないのはなぜですか?
パチェリエ2017

@Pacerier:それらがなぜ完全に別の場所に配置されたのかはわかりませんが、システム変数またはユーザー変数、あるいはその両方を確実に削除したい場合は、それらが完全に異なることを知っていると役立ちます場所。
tzrlk 2017

2
@Tzrlk、再びWindows側のねじ込み設計でなければなりません。
パセリエ2017

4

再起動せずに削除

実際、OPの質問には、Powershell、vbscript、またはユーザーが名前を付けて再起動しないようにする方法など、広範囲に回答しています。

ただし、cmdコマンドのみに固執する必要があり、powershellまたはvbscriptを呼び出すことができるという贅沢がない場合は、次のアプローチを使用できます。

rem remove from current cmd instance
  SET FOOBAR=
rem remove from the registry if it's a user variable
  REG delete HKCU\Environment /F /V FOOBAR
rem remove from the registry if it's a system variable
  REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
rem tell Explorer.exe to reload the environment from the registry
  SETX DUMMY ""
rem remove the dummy
  REG delete HKCU\Environment /F /V DUMMY

したがって、ここでの魔法は、 "setx"を使用して不要な変数(例ではDUMMY)に何かを割り当てることにより、Powershellを必要とせずに、Explorer.exeにレジストリから変数を再度読み込ませることです。次に、そのダミーをクリーンアップします。そのダミーは、少しの間Explorerの環境に留まりますが、おそらく誰にも害はありません。

または、変数を削除した後で新しい変数を設定する必要がある場合は、ダミーも必要ありません。SETXを使用して新しい変数を設定するだけで、開始した可能性のある新しいcmdタスクから削除した変数が自動的にクリアされます。

背景情報:このアプローチを使用して、既存のcmdスクリプトを変更することにより、自分の仕事ですべてのコンピューター上でユーザー変数のセットを同じ名前のシステム変数に置き換えました。コンピューターが多すぎて手動で実行できず、追加のPowerShellまたはvbscriptをすべてのコンピューターにコピーすることも現実的ではありませんでした。ユーザーをシステム変数に置き換える必要があったのは、ローミングプロファイルでユーザー変数が同期されるため(考えていなかったため)、同じWindowsログインを使用しているが異なる値を必要とする複数のマシンが混同されたためです。


3
setx FOOBAR ""

FOOBARの値をnull文字列にするだけです。(ただし、set""が付いたコマンドで表示されるため、おそらく二重引用符が文字列です。)

私が使用した:

set FOOBAR=

その後、FOOBARはsetコマンドにリストされなくなりました。(ログオフは必要ありませんでした。)

Windows 7 32ビット、コマンドプロンプトを使用して、非管理者が私が使用したものです。(異なる場合があるcmdまたはWindows+ Rではありません。)

ところで、変数を作成した後、レジストリのどこかに変数を作成していません。管理者としてではなく、RegEditを使用しています。


1

小さなVBScriptスクリプトを作成することもできます。

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

欠点は、追加のスクリプトが必要ですが、再起動する必要がないことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.