2014-12-04 122 views
1

我想重置除列表中的所有环境变量以外的所有环境变量。使用批处理文件重置环境变量

我试试这个:

@echo OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
set notToChange=APPDATA PATH 
for /f "delims=" %%i in ('set') do (
    for /f "delims==" %%j in ("%%i") do (
     set "var=%%j" 
    ) 
    if "%notToChange%"=="%notToChange:!var!=%" (
     set !var!= 
    ) 
) 

我有一个问题:

if "%notToChange%"=="%notToChange:!var!=%" 

这是行不通的。我不懂为什么。

+2

即使可以做,以保持这也将工作,这似乎是一个坏主意 – jeb 2014-12-04 13:28:03

+0

的确。看起来像重新启动会更安全。 :) – rojo 2014-12-04 13:44:26

+0

当您想测试软件并验证您的软件包中包含所有库时,它非常有用。 – artoon 2014-12-04 14:02:48

回答

1

扩展不按照您希望的方式工作。
您需要使用另一个FOR-Loop才能替换该变量。
附加循环拷贝变量var到参数​​3210

@echo OFF 
setlocal EnableDelayedExpansion 
set "notToChange=APPDATA PATH notToChange" 
for /f "delims=" %%i in ('set') do (
    for /f "delims==" %%j in ("%%i") do (
     set "var=%%j" 
    ) 

    for /F "delims=" %%V in ("!var!") do (
      if "!notToChange:%%~V=!" == "!notToChange!" (
       set "!var!=" 
     ) 
    ) 
) 

读取脱线的溶液后,我意识到notToChange变量的问题,所以我添加了一些代码,以避免该问题

顺便说一句。这将删除变量只有里面的批处理文件,为年底的setlocal将由endlocal被隐恢复后,恢复所有变量

2
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
set "notToChange=APPDATA PATH" 
for /f "delims==" %%i in ('set') do IF /i "%%i" neq "nottochange" IF /i "%nottochange%" equ "!nottochange:%%i=!" ECHO clear %%i 

GOTO :EOF 

我建议这个例程非常小心。我只是简单地评论说要清除这个变量(set "%%i="应该清除它,如果这就是你真正想做的事情......)

不是说nottochange需要在不改变我的列表中。

+0

“notToChange”变量本身的问题是重要的一点。 – jeb 2014-12-04 13:27:04

1
set "notToChange=APPDATA PATH" 
for /f "delims==" %%a in ('set') do (
    set "remove=1" 
    for %%b in (%notToChange%) do if /i "%%a"=="%%b" set "remove=" 
    if defined remove set "%%a=" & set "remove=" 
) 
set 

眼看已经发布代码,我不知道如果我错过一些东西,但是这应该做这项工作。

编辑是的,我没有看到的是,它不像我想的那么容易。这是比较容易

(
    for /f "delims==" %%a in ('set') do set "%%a=" 
    set "PATH=%path%" 
    set "APPDATA=%appdata%" 
) 
set 

再次编辑。如果您想使用配置变量

set "notToChange=APPDATA PATH" 

for /f "delims==" %%a in ('set') do (
    setlocal enabledelayedexpansion 
    if not defined notToChange set "notToChange=%notToChange%" 
    for /f "delims=" %%b in ("!notToChange:%%a=!=") do (
     endlocal 
     if /i "%notToChange%=" equ "%%b" set "%%a=" 
    ) 
) 
set 
相关问题