มีวิธีที่จะผลักดันและวางตัวแปรสภาพแวดล้อมทั้งหมดในชุดสคริปต์หรือไม่?


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หรือไม่?
Wolf

ในความเป็นจริงทั้งสองตัวอย่างและในกรณีที่การเปลี่ยนแปลงที่สำคัญถูกนำไปใช้กับเส้นทางในขณะเดียวกันข้อควรระวัง @wolf
LotPings

คุณไม่สามารถแน่ใจได้ในทุกกรณี แต่ถ้าคุณต้องเพิ่มบางสิ่งบางอย่างในเส้นทางสำหรับเซสชันที่ระบุเท่านั้นคุณสนใจที่จะกู้คืนเส้นทางในภายหลัง คุณไม่จำเป็นต้องทำสิ่งนี้หากไม่มีเครื่องมือภายนอกที่เรียกเครื่องมืออื่น ๆ และคาดหวังว่าพวกเขาจะอยู่ในเส้นทาง
Wolf

1
รหัสจะเปิดให้มีการเปลี่ยนแปลงหากต้องการคืนสภาพแวดล้อมทั้งหมดเพียงแค่แทนที่ findstr ด้วยประเภท
LotPings

ขอบคุณฉันแค่อยากให้แน่ใจว่าจะไม่มองข้ามสิ่งที่สำคัญ
Wolf

1

ช้าไปหน่อย แต่ก็ยังไปไม่ถึง ด้านล่างคือการนำโครงสร้างข้อมูลสแต็กมาใช้ในการสร้างสคริปต์ชุดงาน Windows

คุณสมบัติ:

  • คุณต้องเรียกใช้รูทีนย่อย: InitializeStackก่อนที่จะใช้สแต็ก
  • ผลักดันไอเท็มบนสแต็กโดยการเรียก:รูทีนย่อยPush
  • ป๊อปไอเท็มออกจากสแต็กโดยเรียกรูทีนย่อย: Pop
  • ตัวแปร$ Countจะมีจำนวนรายการในสแต็กเสมอ
  • ตัวแปร$ Topจะมีรายการล่าสุดที่เพิ่มไปยังสแต็กเสมอ
  • ตัวแปร$ Bottomจะมีรายการแรกที่ถูกเพิ่มลงในสแต็กเสมอ
  • คุณสามารถดัมพ์เนื้อหาของสแต็กได้โดยเรียกรูทีนย่อย: DumpStack
  • ประเภทของรายการที่คุณสามารถกดลงบนสแต็กคืออะไรก็ได้ที่สามารถเก็บไว้ในตัวแปรได้ ยกตัวอย่างเช่นการโทร: กด "String 1" , โทร: กด "% 1" , โทร: กด "%% myVariable"ฯลฯ

ฉันใช้สแต็คในไฟล์แบตช์ของฉันเพื่อติดตามการเรียกรูทีนย่อย ย่อยในไฟล์ชุดของฉันทุกคนเริ่มต้นด้วยการโทร: กด 0%ซึ่งผลักดันให้ชื่อ subroutine ปัจจุบันบนสแต็คและจบลงด้วยการโทร: ป๊อป

บางคนอาจพบว่ามันมากกว่าการฆ่าสำหรับการเขียนสคริปต์ชุด แต่ผมมีความสุขกับการสร้างมันและฉันหวังว่าคนจะพบว่ามีประโยชน์นี้เพลิดเพลินไปกับ

@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


นี่คือภาพรวม - เป็นสิ่งที่อาจต้องใช้ความพยายามในการพัฒนาและอาจเป็นประโยชน์กับบางคน คุณช่วยอธิบายวิธีนี้ให้คำตอบสำหรับคำถามนี้ได้อย่างไร
สกอตต์

ฉันเห็นประเด็นของคุณเพื่อผลักดันตัวแปรสภาพแวดล้อมทั้งหมดที่คุณสามารถใช้: 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.