2014-12-04 2 views
1

목록의 환경 변수를 제외한 모든 환경 변수를 재설정하고 싶습니다. 배치 파일로 환경 변수 재설정

나는 이것을 시도 :

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

가 작동하지 않습니다

@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!= 
    ) 
) 

나는 문제가있다. 나는 왜 그런지 이해하지 못한다.

+2

변수 구성을 계속 사용하려는 경우도 작동합니다, 나쁜 생각 – jeb

+0

실제로 것으로 보인다. 다시 부팅하는 것이 안전 할 것 같습니다. :) – rojo

+0

테스트를 부드럽게하고 패키지에있는 모든 librairies를 가지고 있는지 확인하는 데 매우 유용합니다. – artoon

답변

1

확장 기능이 원하는대로 작동하지 않습니다.
변수를 바꿀 수 있으려면 다른 FOR-Loop를 사용해야합니다.
추가적인 루프 복사 파라미터 %%V

@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!=" 
     ) 
    ) 
) 

하는 변수 var에게 Magoo 용액을 읽은 후에, I는 notToChange 변수의 문제를 실현, 그래서이 문제를

Btw은 피하기 위해 일부 코드를 추가 . 이 모든 변수가

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

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 

내가 부족하면 나도 몰라 이미 게시 된 코드를보고 복원의 setlocal가 암시 적으로 endlocal으로 되돌아갑니다 종료 후으로 만 배치 파일 내부의 변수를 삭제합니다 하지만이 일을해야합니다.

편집 예, 내가 보지 못했던 것은 내가 생각하고있는 것처럼 쉽지 않다는 것입니다.

(
    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