Toplu iş komut dosyasındaki tüm ortam değişkenlerini aktarmanın ve patlatmanın bir yolu var mı?


10

Toplu iş komut dosyasındaki tüm ortam değişkenlerini aktarmanın ve patlatmanın bir yolu var mı? Örneğin böyle bir şey yapmak istiyorum:

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

Yanıtlar:


13

Setlocal kullanın, bkz. setlocal /?Veya ss64.com/nt/setlocal

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

Mevcut değişken durumunu kaydetmek için

set >MyVarStatus.txt

ve daha sonra

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

bu Path değişkenlerini hariç tutar.


Hariç tutuyorsunuz PATH- sadece örneğin veya herhangi bir nedenle. Ben özellikle yol değişken itme / pop ile ilgileniyorum. Yedeklemeye / geri yüklemeye karşı konuşan bir şey var mı PATH?
Wolf

Aslında hem bir örnek hem de bu durumda önemli değişiklikler yol boyunca uygulanmıştı. @wolf
LotPings

Her durumda emin olamazsınız, ancak yalnızca belirli bir oturum için yola bir şeyler eklemeniz gerekiyorsa, kesinlikle yolu daha sonra geri yüklemekle ilgileniyorsunuz. Diğer araçları çağıran ve bunların yolda olmalarını bekleyen harici araçlar olmasa bunu yapmak zorunda kalmazsınız.
Wolf

1
Kod değişikliklere açıktır, eğer kişi tüm ortamı geri yüklemek istiyorsa, findstr yerine type yazın.
LotPings

Teşekkürler, sadece önemli bir şeyi gözden kaçırmamaya emin olmak istedim.
Wolf

1

Sahneye biraz geç ama yine de burada. Aşağıda, Windows toplu komut dosyasında yığın veri yapısının bir uygulaması yer almaktadır.

Özellikleri:

  • Yığını kullanmadan önce : InitializeStack alt yordamını çağırmalısınız .
  • Aşağıdakileri arayarak yığındaki öğeleri itin : Push altyordam.
  • : Pop altyordamını çağırarak öğeleri yığından çıkarın .
  • $ Count değişkeni her zaman yığındaki öğe sayısını içerir.
  • $ Top değişkeni her zaman yığına eklenen en son öğeyi içerir.
  • $ Bottom değişkeni her zaman yığına eklenen ilk öğeyi içerir.
  • DumpStack altyordamını çağırarak yığının içeriğini dökebilirsiniz .
  • Yığına basabileceğiniz öğelerin türü, bir değişkende saklanabilecek her şeydir. Örneğin, Call: Push "String 1" , Call: Push "% 1" , Call: Push "% MyVariable%" , vb.

Alt program çağrılarını izlemek için toplu iş dosyalarımdaki yığını kullanıyorum. Toplu iş dosyalarımdaki her alt yordam , geçerli alt yordamın adını yığına iten ve Call: Pop ile biten Call: Push% 0 ile başlar .

Bazıları toplu betik için aşırı bir ölüm bulabilir ama ben onu oluşturmaktan keyif aldım ve umarım birisi bunu faydalı bulacaktır, keyfini çıkarın .

@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

Böylece, tüm ortam değişkenlerini itmek için çağırabilirsiniz: PushAllEnvironmentVariables, tüm ortam değişkenlerini geri yüklemek için şunu çağırabilirsiniz: PopAllEnvironmentVariables


Bu - bir bakışta - geliştirmek için biraz çaba gerektiren ve belki birileri için yararlı olabilecek bir şey gibi görünüyor. Bunun bu soruya nasıl bir cevap verdiğini
Scott

Anlamak istediğim, kullanabileceğiniz tüm ortam değişkenlerini itmek için: Kullanabileceğiniz For /f "Tokens=* Delims=" %%a In ('Set') Do Call :Push "%%a" tüm ortam değişkenlerini geri yüklemek için: For /l %%a In (!$Stack[0]!,-1,1) Do (Set !$Stack[%%a]!) Cevabı, bunu uygulayan 2 alt rutini içerecek şekilde güncelledim.
Safwan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.