Windows有setx
命令
Description:
Creates or modifies environment variables in the user or system
environment.
所以你可以像这样设置一个变量
setx FOOBAR 1
你可以像这样清除值
setx FOOBAR ""
但是,该变量不会被删除,它会保留在注册表中
那么你如何实际删除变量?
答案 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”的用户环境变量并在之后启动的流程中反映更改,请执行以下操作。
注意,您可能需要更新您的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
}
});
缺点是您需要一个额外的脚本,但不需要重新启动。