用于从OS级别配置中删除环境变量的命令行

时间:2012-11-04 20:46:42

标签: windows registry environment-variables

Windows有setx命令

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

所以你可以像这样设置一个变量

setx FOOBAR 1

你可以像这样清除值

setx FOOBAR ""

但是,该变量不会被删除,它会保留在注册表中

foobar

那么你如何实际删除变量?

9 个答案:

答案 0 :(得分:157)

要从当前环境中删除变量(不是永久):

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 :(得分:70)

要从当前命令会话中删除该变量而不将其永久删除,请使用常规内置set命令 - 只需在等号后面放置任何内容:

set FOOBAR=

要确认,请运行不带参数的set并检查当前环境。该变量应该完全从列表中删除。

  

注意:这只会从当前环境中删除变量 - 它不会将更改保留在注册表中。当一个新的命令进程启动时,该变量将返回。

答案 2 :(得分:15)

这已经涵盖了很多,但是缺少一条至关重要的信息。希望我能帮助澄清这是如何运作的,并给疲惫的旅行者带来一些缓解。 : - )

从当前流程中删除

显然,每个人都知道你这样做是为了从当前进程中删除一个环境变量:

set FOO=

持续删除

有两组环境变量,系统范围和用户。

删除用户环境变量:

reg delete "HKCU\Environment" /v FOO /f

删除系统范围的环境变量:

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

在不重新启动的情况下应用值

这是缺少的神奇信息!您想知道为什么在执行此操作后,当您启动新的命令窗口时,环境变量仍然存在。原因是因为explorer.exe没有更新其环境。当一个进程启动另一个进程时,新进程将从启动它的进程继承环境。

有两种方法可以在不重新启动的情况下解决此问题。最蛮力的方法是杀死您的explorer.exe进程并再次启动它。您可以从任务管理器执行此操作。但是,我不推荐这种方法。

另一种方法是告诉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. 关闭并重新打开命令提示符,您将看到不再定义环境变量。
  5. 注意,您可能需要更新您的Powershell设置以允许您运行此脚本,但我会将其作为Google-Foo练习保留。

答案 3 :(得分:13)

同意CupawnTae。

SET对主环境的更改无效。

仅供参考:系统变量位于HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment (比用户变量更长的时间)。

对于名为FOOBAR的系统var的完整命令是: REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR (注意处理空间所需的报价)

太糟糕了,setx命令不支持删除语法。 :(

PS:负责任地使用 - 如果你杀死你的路径变量,不要怪我!

答案 4 :(得分:11)

上面的命令没有用,但确实如此:

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

快捷方式HKLM可用于HKEY_LOCAL_MACHINE

答案 5 :(得分:8)

PowerShell 中,您可以使用.NET https://darkorbit.com/方法:

  • 删除名为FOO用户环境变量

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

请注意,$null用于更好地表示要删除变量的意图,尽管从技术上讲,它实际上与传递''相同。

  • 删除名为FOO系统(计算机级)环境变量-需要海拔高度(必须以管理员身份运行):

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

除了执行速度更快外,与[System.Environment]::SetEnvironmentVariable()相比的优势在于,通过WM_SETTINGCHANGE消息向其他应用程序通知了更改(尽管并非所有应用程序都在监听该消息)消息)。

答案 6 :(得分:2)

setx FOOBAR&#34;&#34; 只是使FOOBAR的值为空字符串。 (虽然,它用set命令显示&#34;&#34;所以也许双引号是字符串。

我用过: 设置FOOBAR =

然后FOOBAR不再列在set命令中。 (不需要注销。)

Win7 32bit,使用命令提示符,非管理员是我使用的。 (不是cmd或Windows-r,可能不同。)

顺便说一下,我创建后没有看到我在注册表中创建的变量。我使用regedit而不是管理员。

答案 7 :(得分:2)

删除而不重新启动

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中),您可以强制Explorer.exe从注册表重新读取变量,而无需使用powershell。然后,您清理该虚拟对象,即使该虚拟对象在Explorer的环境中停留了一段时间,也可能不会伤害任何人。

或者,如果在删除变量后需要设置新变量,那么甚至不需要任何虚拟变量。仅使用SETX设置新变量将自动清除您刚刚从可能开始的任何新cmd任务中删除的变量。

背景信息:通过修改现有的cmd脚本,我刚刚成功地使用了这种方法,用我所有工作的所有计算机上的同名系统变量替换了一组用户变量。太多的计算机无法手动执行此操作,将多余的powershell或vbscript复制到所有这些计算机上也不可行。我迫切需要用系统变量替换用户的原因是,用户变量在漫游配置文件中得到了同步(没有考虑这一点),因此使用同一Windows登录名但需要不同值的多台计算机混杂在一起。

答案 8 :(得分:0)

您还可以创建一个小的VBS脚本:

%windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR

然后将其命名为btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { listItems.add("Apple"); adapter.notifyDataSetChanged(); //i want to update the textview here } });

缺点是您需要一个额外的脚本,但不需要重新启动。