배치 스크립트에서 모든 환경 변수를 푸시하고 팝하는 방법이 있습니까?


10

배치 스크립트에서 모든 환경 변수를 푸시하고 팝하는 방법이 있습니까? 예를 들어 다음과 같이하고 싶습니다.

pushEnvironmentVariables
call "%VS140COMNTOOLS%\vsvars32.bat"
(do some stuff...)
popEnvironmentVariables
pushEnvironmentVariables
call "%VS90COMNTOOLS%\vsvars32.bat"
(do some other stuff...)
popEnvironmentVariables

답변:


13

사용 SETLOCAL, 참조 setlocal /?또는 ss64.com/nt/setlocal

Setlocal
call "%VS140COMNTOOLS%\vsvars32.bat"
(do some stuff...)
Endlocal
Setlocal
call "%VS90COMNTOOLS%\vsvars32.bat"
(do some other stuff...)
Endlocal

현재 변수 상태를 저장하려면 할 수 있습니다

set >MyVarStatus.txt

나중에 다시 복원

@Echo off
For /f "tokens=1* delims==" %%A in (
  'findstr /V "^Path" MYVarStatus.txt '
) Do Set %%A=%%B

Path 변수는 제외됩니다.


PATH예를 들어 또는 어떤 이유로 든 제외 합니다. 특히 경로 변수 푸시 / 팝에 관심이 있습니다. 백업 / 복원에 대해 말하는 것이 PATH있습니까?
Wolf

실제로, 예를 들어 중요한 경우에 대비하여 경로에 중요한 변경 사항이 적용되었습니다. @wolf
LotPings

글쎄, 모든 경우에 확신 할 수는 없지만 특정 세션에 대해서만 경로에 무언가를 추가해야하는 경우 나중에 경로를 복원하는 데 관심이 있습니다. 다른 도구를 호출하고 경로에있을 것으로 예상되는 외부 도구가없는 경우에는이 작업을 수행하지 않아도됩니다.
Wolf

1
전체 환경을 복원하려면 findstr을 유형으로 바꾸면 코드가 변경 될 수 있습니다.
LotPings

고마워, 나는 단지 중요한 것을 간과하지 않기를 원했습니다.
Wolf

1

조금 늦었지만 여기에 간다. 아래는 Windows 배치 스크립팅에서 스택 데이터 구조를 구현 한 것입니다.

풍모:

  • 스택을 사용하기 전에 : InitializeStack 서브 루틴을 호출해야합니다 .
  • : Push 서브 루틴 을 호출하여 스택의 항목을 푸시하십시오 .
  • : Pop 서브 루틴 을 호출하여 스택에서 항목을 팝하십시오 .
  • 변수 $ Count 는 항상 스택의 항목 수를 포함합니다.
  • 변수 $ Top 에는 항상 스택에 추가 된 가장 최근 항목이 포함됩니다.
  • 변수 $ Bottom 은 항상 스택에 추가 된 첫 번째 항목을 포함합니다.
  • : DumpStack 서브 루틴 을 호출하여 스택의 컨텐츠를 덤프 할 수 있습니다 .
  • 스택에 푸시 할 수있는 항목 유형은 변수에 저장할 수있는 것입니다. 예를 들어 Call : Push "String 1" , Call : Push "% 1" , Call : Push "% MyVariable %" 등이 있습니다.

배치 파일의 스택을 사용하여 서브 루틴 호출을 추적합니다. 배치 파일의 모든 서브 루틴은 Call : Push % 0으로 시작 하여 현재 서브 루틴의 이름을 스택으로 푸시하고 Call : Pop으로 끝납니다 .

일부는 배치 스크립팅에 과잉 살인을 발견 할 수는 있지만 작성하는 것을 즐겼으며 누군가가 유용하다고 생각하기를 바랍니다 .

@Echo Off
Cls
SetLocal
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

Call :InitializeStack

Call :Push "String 1"
Call :Push "String 2"
Call :Push "String 3"
Call :Pop

Echo Total items in stack = !$Count!
Echo Top of stack         = !$Top!
Echo Bottom of stack      = !$Bottom!
Call :DumpStack

Goto End

:InitializeStack
:------------------------------------------------------------
Set "$Stack[0]=0"
Set "$Count=!$Stack[0]!"
Set "$Top="
Set "$Bottom="
Exit /b

:DumpStack
:------------------------------------------------------------
If !$Stack[0]! EQU 0 (
  Echo Stack is empty.
) Else (
  Echo.
  Echo Stack Dump
  Echo ----------
  For /l %%a In (!$Stack[0]!,-1,1) Do (Echo !$Stack[%%a]!)
)
Exit /b

:Push <String>
:------------------------------------------------------------
Set /a "$Stack[0]+=1"
Set "$Count=!$Stack[0]!"
Set "$Top=%~1"
Set "$Bottom=!$Stack[1]!"
Set "$Stack[!$Stack[0]!]=!$Top!"
Exit /b

:Pop
:------------------------------------------------------------
If !$Stack[0]! EQU 0 (
  Echo "Stack is empty."
) Else (
  Set "$Stack[!$Stack[0]!]="
  Set /a "$Stack[0]-=1"
  Set "$Count=!$Stack[0]!"
  If !$Stack[0]! GTR 0 (
    For %%a In (!$Stack[0]!) Do Set "$Top=!$Stack[%%a]!"
    Set "$Bottom=!$Stack[1]!"
  ) Else (
    Set "$Top="
    Set "$Bottom="
  )
)Exit /b

:PushAllEnvironmentVariables
:------------------------------------------------------------
For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a"
Exit /b

:PopAllEnvironmentVariables
:------------------------------------------------------------
For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!)
Exit /b

:End

따라서 모든 환경 변수를 푸시하려면 : PushAllEnvironmentVariables를 호출하고 모든 환경 변수를 복원하려면 : PopAllEnvironmentVariables를 호출하십시오.


이것은 한 눈에보기에 약간의 개발 노력이 필요한 것으로 보이며 누군가에게 유용 할 수 있습니다. 이것이 어떻게이 질문에 대한 을 제공
Scott

사용할 수있는 모든 환경 변수를 푸시하려는 요점을 알 수 있습니다. 사용할 수있는 모든 환경 변수 For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" 를 복원하려면 : 이것을 For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) 구현하는 2 개의 서브 루틴을 포함하도록 답변을 업데이트했습니다.
Safwan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.