2014-12-04 111 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 
相關問題