Apakah ada cara untuk mendorong dan menghapus semua variabel lingkungan dalam skrip batch?


10

Apakah ada cara untuk mendorong dan menghapus semua variabel lingkungan dalam skrip batch? Misalnya saya ingin melakukan sesuatu seperti ini:

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

Jawaban:


13

Gunakan setlocal, lihat setlocal /?atau ss64.com/nt/setlocal

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

Untuk menyimpan status variabel saat ini yang dapat Anda lakukan

set >MyVarStatus.txt

dan kembalikan nanti dengan

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

ini akan mengecualikan variabel Path.


Anda mengecualikan PATH- hanya untuk contoh atau karena alasan tertentu. Saya terutama tertarik pada variabel push / pop path. Apakah ada yang mendukung backup / restore PATH?
Wolf

Bahkan keduanya, contoh dan jika perubahan penting diterapkan pada jalur sementara tindakan pencegahan. @ serigala
LotPings

Ya, Anda tidak dapat memastikan dalam semua kasus, tetapi jika Anda harus menambahkan sesuatu ke jalur untuk sesi tertentu saja, Anda pasti tertarik untuk memulihkan jalur setelahnya. Anda tidak perlu melakukan ini jika tidak ada alat eksternal yang memanggil alat lain dan mengharapkan mereka berada di jalur.
Wolf

Kode terbuka untuk perubahan, jika seseorang ingin mengembalikan seluruh lingkungan cukup ganti findstr dengan tipe.
Lotings

Terima kasih, saya hanya ingin memastikan untuk tidak mengabaikan sesuatu yang penting.
Wolf

1

Agak terlambat ke tempat kejadian tapi begini saja. Di bawah ini adalah implementasi dari struktur data stack dalam skrip batch Windows.

Fitur:

  • Anda harus memanggil : Inisialisasi subrutin sebelum menggunakan stack.
  • Dorong item pada tumpukan dengan memanggil : Dorong subrutin.
  • Pop item dari tumpukan dengan memanggil : Pop subroutine.
  • Variabel $ Count akan selalu berisi jumlah item dalam tumpukan.
  • Variabel $ Top akan selalu berisi item terbaru yang ditambahkan ke stack.
  • Variabel $ Bawah akan selalu berisi item pertama yang ditambahkan ke stack.
  • Anda dapat membuang konten tumpukan dengan memanggil : DumpStack subroutine.
  • Jenis item yang bisa Anda dorong di tumpukan adalah apa saja yang dapat disimpan dalam variabel. Misalnya, Panggil: Tekan "String 1" , Panggil: Tekan "% 1" , Panggil: Tekan "% MyVariable%" , dll.

Saya menggunakan tumpukan di file batch saya untuk melacak panggilan subrutin. Setiap subrutin dalam file kumpulan saya dimulai dengan Panggilan: Tekan% 0 , yang mendorong nama subrutin saat ini ke tumpukan dan diakhiri dengan Panggilan: Pop .

Beberapa orang mungkin menganggapnya sebagai over-kill untuk skrip batch tetapi saya senang membuatnya dan saya berharap seseorang akan menemukan ini berguna, selamat menikmati .

@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

Jadi, untuk mendorong semua variabel lingkungan yang dapat Anda panggil: PushAllEnvironmentVariables, untuk mengembalikan semua variabel lingkungan, Anda dapat memanggil: PopAllEnvironmentVariables


Ini terlihat — sekilas — menjadi sesuatu yang mungkin perlu upaya untuk dikembangkan, dan mungkin bisa bermanfaat bagi seseorang. Bisakah Anda menjelaskan bagaimana ini memberikan jawaban untuk pertanyaan ini ?
Scott

Saya mengerti maksud Anda, untuk mendorong semua variabel lingkungan yang dapat Anda gunakan: For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" Untuk mengembalikan semua variabel lingkungan yang dapat Anda gunakan: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) Saya telah memperbarui jawaban untuk menyertakan 2 subrutin yang mengimplementasikan ini.
Safwan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.