web-dev-qa-db-ja.com

OSレベルの設定から環境変数を削除するためのコマンドライン

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

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

だから、あなたはこのような変数を設定することができます

setx FOOBAR 1

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

setx FOOBAR ""

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

foobar

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

141
anon

現在の環境から変数を削除するには(しないでを永久に):

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コマンドは、既存のプロセス(および既存のプロセスから分岐されたいくつかの新しいプロセス)には影響しません。したがって、変更をすぐに有効にすることが重要な場合は、ログアウトして再度ログインするか再起動します。

158
CupawnTae

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

set FOOBAR=

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

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

70
Brian Kelly

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

現在のプロセスから削除

明らかに、あなたは現在のプロセスから環境変数を削除するためだけにこれを行うことを誰もが知っています:

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

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

注:このスクリプトを実行できるようにするには、おそらくPowershell設定を更新する必要がありますが、私はそれをGoogle-Fooの練習として残します。 。

15
Jamie

CupawnTaeに同意します。

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

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

したがって、FOOBARという名前のシステム変数のフルコマンドは次のとおりです。REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR(スペースを処理するために必要な引用符に注意してください)

残念ながら、setxコマンドは削除構文をサポートしていません。 :(

シモンズ:責任を持って使う - あなたがあなたのパス変数を殺したとしても、私を責めないでください!

13
DougWare

上記のコマンドは機能しませんでしたが、これはしました:

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

ショートカットHKLMHKEY_LOCAL_MACHINEに使用できます。

11
user4297498

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メッセージを介しての変更を通知されることです(すべてのアプリケーションが聞くことはできません)そのメッセージ)。

8
mklement0

setx FOOBAR ""はFOOBARの値をNULL文字列にするだけです。 (ただし、setコマンドで ""を使って表示されているので、二重引用符で囲まれている可能性があります。

私は使った:set FOOBAR =

fOOBARはsetコマンドにリストされなくなりました。 (ログオフ不要)

Win7 32ビット、コマンドプロンプトを使用して、非管理者は私が使用したものです。 (cmdやWindows-rではなく、違うかもしれません。)

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

2
PReinie

小さな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のようにそれを呼び出します

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

0