Có cách nào để đẩy và bật tất cả các biến môi trường trong một tập lệnh bó không?


10

Có cách nào để đẩy và bật tất cả các biến môi trường trong một tập lệnh bó không? Ví dụ tôi muốn làm một cái gì đó như thế này:

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

Câu trả lời:


13

Sử dụng setlocal, xem setlocal /?hoặc ss64.com/nt/setlocal

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

Để lưu trạng thái biến hiện tại bạn có thể làm

set >MyVarStatus.txt

và khôi phục sau này với

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

điều này sẽ loại trừ các biến Path.


Bạn loại trừ PATH- chỉ cho ví dụ hoặc vì một số lý do. Tôi đặc biệt quan tâm đến việc đẩy / bật biến đường dẫn. Có bất cứ điều gì nói chống lại sao lưu / khôi phục PATH?
Sói

Trong thực tế cả hai, một ví dụ và trong trường hợp thay đổi quan trọng đã được áp dụng cho đường dẫn trong khi đó là một biện pháp phòng ngừa. @wolf
LotPings

Chà, bạn không thể chắc chắn trong mọi trường hợp, nhưng nếu bạn phải thêm một cái gì đó vào đường dẫn cho một phiên cụ thể, bạn chắc chắn quan tâm đến việc khôi phục đường dẫn sau đó. Bạn sẽ không phải làm điều này nếu không có các công cụ bên ngoài gọi các công cụ khác và hy vọng chúng sẽ nằm trong đường dẫn.
Sói

1
Mã được mở để thay đổi, nếu một người muốn khôi phục toàn bộ môi trường chỉ cần thay thế findstr bằng loại.
LotPings

Cảm ơn, tôi chỉ muốn chắc chắn không bỏ qua bất cứ điều gì quan trọng.
Sói

1

Một chút muộn để đến hiện trường nhưng ở đây đi dù sao đi nữa. Dưới đây là một triển khai cấu trúc dữ liệu ngăn xếp trong tập lệnh bó Windows.

Đặc trưng:

  • Bạn phải gọi chương trình con : InitializeStack trước khi sử dụng ngăn xếp.
  • Đẩy các mục trên ngăn xếp bằng cách gọi chương trình con : Đẩy chương trình con.
  • Các mục pop khỏi ngăn xếp bằng cách gọi chương trình con Pop .
  • Biến $ Count sẽ luôn chứa số lượng vật phẩm trong ngăn xếp.
  • Biến $ Top sẽ luôn chứa mục gần đây nhất được thêm vào ngăn xếp.
  • Biến $ bottom sẽ luôn chứa mục đầu tiên được thêm vào ngăn xếp.
  • Bạn có thể kết xuất nội dung của ngăn xếp bằng cách gọi chương trình con : DumpStack .
  • Loại vật phẩm mà bạn có thể đẩy vào ngăn xếp là bất cứ thứ gì có thể được lưu trữ trong một biến. Ví dụ : Gọi: Đẩy "Chuỗi 1" , Gọi: Đẩy "% 1" , Gọi: Đẩy "% MyVariable%" , v.v.

Tôi sử dụng ngăn xếp trong các tệp bó của mình để theo dõi các cuộc gọi chương trình con. Mỗi chương trình con trong các tệp bó của tôi bắt đầu bằng Call: Push% 0 , sẽ đẩy tên của chương trình con hiện tại lên ngăn xếp và kết thúc bằng Call: Pop .

Một số người có thể thấy nó là một sự tiêu diệt quá mức đối với kịch bản hàng loạt nhưng tôi rất thích tạo ra nó và tôi hy vọng ai đó sẽ thấy điều này hữu ích, hãy tận hưởng .

@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

Vì vậy, để đẩy tất cả các biến môi trường, bạn có thể gọi: Push ALLEn MôiVariables, để khôi phục tất cả các biến môi trường, bạn có thể gọi: Pop ALLEn MôiVariables


Điều này có vẻ như là một trò chơi có thể mất một chút nỗ lực để phát triển và có thể hữu ích cho ai đó. Bạn có thể giải thích làm thế nào điều này cung cấp một câu trả lời cho câu hỏi này ?
Scott

Tôi thấy quan điểm của bạn, để đẩy tất cả các biến môi trường bạn có thể sử dụng: For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" Để khôi phục tất cả các biến môi trường bạn có thể sử dụng: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) Tôi đã cập nhật câu trả lời để bao gồm 2 chương trình con thực hiện điều này.
Safwan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.