Cmd โดยใช้ตัวแปร การกำหนดอักษรระบุไดรฟ์เดียวกันให้กับไดรฟ์แบบถอดได้ การดำเนินการกับตัวแปรเช่นเดียวกับตัวเลข

การประกาศตัวแปรของคุณเองเป็นส่วนสำคัญของภาษาการเขียนโปรแกรมเกือบทุกภาษา ดังนั้นในภาษา vbscript ตัวแปรจึงถูกประกาศโดยใช้คำสำคัญ สลัวและใน jscript จะใช้ คำหลัก var.

ตัวแปร บรรทัดคำสั่ง Windows แตกต่างออกไปเล็กน้อย คุณไม่สามารถประกาศกลุ่มตัวแปร cmd หรือกำหนดค่าให้กับตัวแปรหลายตัวพร้อมกันบนบรรทัดคำสั่ง เรามาดูกันดีกว่า บรรทัดถัดไปรหัส:

เสียงสะท้อน % Var3% เสียงสะท้อน % VAR3% เสียงสะท้อน % vAr3%

จุดหนึ่งที่ควรพิจารณาคือการบันทึก

ตั้ง var1 = 100
ตั้งค่า var1 = 100

นี่ไม่ใช่สิ่งเดียวกันนั่นคือในกรณีแรกเราสร้างตัวแปร cmd "var1" และในกรณีที่สอง - "var1" สถานการณ์ก็คล้ายๆ กับการกำหนดค่า ดังนั้น ควรใส่ใจกับพื้นที่!!!

เราเห็นว่าเราสามารถแสดงค่าของตัวแปรโดยใช้ฟังก์ชันได้ เอคโค่เราใส่ไว้ในสัญลักษณ์ "%" สำหรับ ชุด– เราเพียงแค่เขียนชื่อของมัน มันก็คุ้มค่าที่จะพิจารณาว่าตัวแปรทั้งหมดถูกกำหนดประเภทสตริง

ถ้าคุณวิ่ง คำสั่ง cmd set ซึ่งแสดงรายการตัวแปรทั้งหมดและค่าของมัน เซสชันปัจจุบันคุณจะเห็นว่าสิ่งที่สร้างขึ้นใหม่ก็จะปรากฏขึ้นที่นั่นด้วย ตัวแปร cmdและ . เราจะสามารถเข้าถึงสิ่งเหล่านี้ได้ตลอดเซสชั่นทั้งหมด

เพื่อล้างตัวแปรในบรรทัดคำสั่ง เส้นวินโดวส์จากเนื้อหา คุณเพียงแค่ต้องกำหนดค่าว่าง:

จะพิมพ์บรรทัด %Var3% และคำสั่ง

ใน ในตัวอย่างนี้เราหลีกเลี่ยงอักขระ & และ ^ ดังนั้นจึงกำหนดวลี:

"100 & 3 = 5"
"100 ^3"

เป็นที่น่าสังเกตว่าหากเราพยายามแสดงค่าของตัวแปรเหล่านี้โดยใช้ ฟังก์ชัน cmdตั้งค่าไว้ก็จะไม่มีปัญหา แต่ถ้าเราใช้ฟังก์ชัน echo เราก็จะได้ผลลัพธ์ที่แตกต่างไปจากที่เราคาดไว้อย่างสิ้นเชิง ดังนั้น เมื่อคุณพยายามรันคำสั่งต่อไปนี้:

ตอนนี้เมื่อรันโค้ด:

เสียงสะท้อน %var4% เสียงก้อง %var5%

ทุกอย่างจะเป็นไปด้วยดี

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

จะถามอะไร พื้นที่ท้องถิ่นการมองเห็นมีการใช้บล็อก SETLOCAL...ENDLOCAL- ตัวแปร cmd บรรทัดคำสั่งของ Windows ทั้งหมดที่ประกาศไว้ตรงกลางบล็อกนี้จะไม่สามารถมองเห็นได้ภายนอกบล็อก เปิดตัวแก้ไข (ฉันใช้โปรแกรมแก้ไข กระดาษจดบันทึก++เนื่องจากจะไฮไลท์โค้ดทันที) และเขียนโค้ดบรรทัดต่อไปนี้ลงไป:

เราจะเห็นว่าอันดับแรกเราประกาศ var1 และกำหนดค่าให้เป็น 0 จากนั้นเราประกาศตัวแปรที่มีชื่อเดียวกันอีกครั้ง แต่อยู่ในบล็อก SETLOCAL...ENDLOCAL- สคริปต์ส่งออกค่าของ var1 ทั้งภายในและส่วนกลาง ฉันใช้ตัวอักษรละตินโดยเฉพาะเพื่อที่ว่าถ้าเกิดอะไรขึ้นคุณจะไม่โดนต้มตุ๋น

ในบทความนี้:

  • การกำหนดตัวแปร
  • ตัวแปรบรรทัดคำสั่ง (พารามิเตอร์การเรียกไฟล์ค้างคาว)
  • ถ้าตัวดำเนินการแบบมีเงื่อนไข
  • ฟังก์ชั่น
  • การใช้ค่าส่งคืน (กำลังประมวลผลโค้ดออก)

การกำหนดตัวแปร

ชุด<Имяпеременной>=<Значениепеременной>

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

ชุดบลาสเตอร์=A220 I5 D1 P330

จากนั้นเมื่อใช้โครงสร้างต่อไปนี้ในแบตช์ไฟล์:

เสียงสะท้อน %บลาสเตอร์%

"A220 I5 D1 P330" จะแสดงบนหน้าจอ ตัวแปรที่กำหนดโดยใช้คำสั่ง SET เรียกว่าตัวแปรสภาพแวดล้อม และจะมองเห็นได้หลังจากดำเนินการจนกว่า DOS จะรีสตาร์ท (เว้นแต่จะเปลี่ยนด้วยตนเองในหน่วยความจำ) นั่นคือสามารถใช้งานได้จากอันเดียว ไฟล์แบตช์หรือโปรแกรมหลังงานในอีกงานหนึ่ง ตัวแปรที่มีชื่อเสียงที่สุดคือตัวแปร PATH ซึ่งเป็นชุดของเส้นทางสำหรับ ค้นหาอย่างรวดเร็วไฟล์. มันถูกตั้งค่าไว้ในไฟล์ autoexec.bat

ตัวแปรบรรทัดคำสั่ง
(พารามิเตอร์สำหรับการเรียกไฟล์ค้างคาว)

%<цифра 0-9>

เช่นเดียวกับภาษาอื่นๆ ในภาษาไฟล์แบตช์ คุณสามารถใช้ตัวแปรที่ได้รับเป็นพารามิเตอร์ของไฟล์ค้างคาวได้

สามารถมีตัวแปรอิสระที่มีอยู่พร้อมกันได้ทั้งหมด 10 ตัว สำหรับการเขียน โปรแกรมที่ซับซ้อนมันค่อนข้างเล็กสำหรับ ทำงานประจำบ่อยครั้ง 3-4 ก็เพียงพอแล้ว ค่าของตัวแปรเท่ากับค่าของพารามิเตอร์ที่เกี่ยวข้องจากบรรทัดคำสั่ง ตัวแปร %0 จะมีชื่อของไฟล์ .bat และเส้นทางไปยังไฟล์ หากคุณระบุไว้ นั่นคือหากคุณรันไฟล์ abc.bat ด้วยพารามิเตอร์ต่อไปนี้:

abc.bat และ bc def

จากนั้นตัวแปร %0 จะมีค่า abc.bat , %1 จะมีค่า a , %2 จะมี bc และ %3 จะมี def คุณสมบัตินี้ใช้กันอย่างแพร่หลายในการสร้างไฟล์แบตช์อเนกประสงค์เมื่อต้องรับมือกับการดำเนินการซ้ำๆ

หากต้องการรับตัวแปรมากกว่า 10 รายการจากบรรทัดคำสั่ง คุณสามารถใช้คำสั่ง SHIFT

คำสั่ง SHIFT อนุญาตให้คุณใช้พารามิเตอร์บรรทัดคำสั่งมากกว่า 10 รายการ อย่างไรก็ตาม พารามิเตอร์ก่อนหน้าที่เกี่ยวข้องจะสูญหายไป กล่าวอีกนัยหนึ่งคำสั่ง SHIFT จะเลื่อนค่าตัวแปรทั้งหมดไปทางซ้ายหนึ่งขั้น นั่นคือ ตัวแปร %0 จะประกอบด้วยค่าที่มีอยู่ในตัวแปร %1 ก่อนหน้านี้ และตัวแปร %1 จะมีค่าของตัวแปร %2 ก่อนการเปลี่ยนแปลง อย่างไรก็ตาม, การดำเนินการนี้ไม่สามารถย้อนกลับได้ กล่าวคือ ไม่สามารถเปลี่ยนตัวแปรกลับได้

ถ้าตัวดำเนินการแบบมีเงื่อนไข

โชคดี, ล่ามคำสั่ง cmd.exe ใน Windows 2000 สมัยใหม่และใหม่กว่ารองรับบล็อกคำสั่งในโครงสร้างการแยกสาขา ทำให้ไม่จำเป็นต้องใช้ IF กับป้ายกำกับ บล็อกคำสั่งจะอยู่ในวงเล็บ ดูเหมือนว่านี้ (เลียนแบบสไตล์การเยื้อง C/C++):

ถ้าเงื่อนไข (

คำสั่ง Rem ของสาขา 'จากนั้น'

เรม...

) อื่น (

คำสั่ง Rem ของสาขา 'else'

เรม...

ตัวอย่างที่เฉพาะเจาะจงใช้:

@ปิดเสียงสะท้อน

ตั้งค่า BUILDMODE=%1

ถ้า "%BUILDMODE%" == "" (

Echo FAIL: ต้องมีอาร์กิวเมนต์ ^(--debug, --release^)

ออก /ข 1

rem ลบยัติภังค์ทั้งหมดออกจากอาร์กิวเมนต์เพื่อทำให้การประมวลผลง่ายขึ้น

ตั้งค่า BUILDMODE=%BUILDMODE:-=%

ถ้า "%BUILDMODE%" == "debug" (

ตั้งค่า CCFLAGS=/Od /MDd /Z7

) อื่น (

ตั้งค่า CCFLAGS=/O2 /MD

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

ถ้า "%BUILDMODE%" == "debug" (

Echo INFO: การตั้งค่าโหมดสภาพแวดล้อมการดีบัก

ตั้งค่า OPTFLAGS=/Od

ตั้งค่า CCFLAGS=%OPTFLAGS% /MDd /Z7

) อื่น (

Echo INFO: การตั้งค่าโหมดการปล่อยสภาพแวดล้อม

ตั้งค่า OPTFLAGS=/O2

ตั้งค่า CCFLAGS=%OPTFLAGS% /MD

สิ่งที่จับได้ก็คือในทั้งสองบล็อก การแทนที่ตัวแปร OPTFLAGS จะเกิดขึ้นก่อนที่จะมีการเปลี่ยนแปลงระหว่างการดำเนินการของบล็อกนั้น ดังนั้น CCFLAGS จะถูกเติมด้วยค่าที่ OPTFLAGS มี ณ เวลาที่ดำเนินการหากบล็อกเริ่มต้นขึ้น

ปัญหานี้แก้ไขได้โดยใช้การขยายตัวแปรแบบหน่วงเวลา ตัวแปรที่มีอยู่ใน !…!

แทนที่จะเป็น %...% ความหมายจะถูกเปิดเผยเฉพาะในขณะที่ใช้งานโดยตรงเท่านั้น โหมดนี้ถูกปิดใช้งานตามค่าเริ่มต้น คุณสามารถเปิดใช้งานได้โดยใช้สวิตช์ /V:ON เมื่อเรียก cmd.exe หรือโดยใช้คำสั่ง:

ด้วยเหตุนี้ ตัวอย่างที่ "ผิด" ก่อนหน้านี้สามารถแก้ไขได้ดังนี้:

setlocal ที่เปิดใช้งานelayedexpansion

ถ้า "%BUILDMODE%" == "debug" (

Echo INFO: การตั้งค่าสภาพแวดล้อมโหมดแก้ไขข้อบกพร่อง

ตั้งค่า OPTFLAGS=/Od

ตั้งค่า CCFLAGS=!OPTFLAGS! /MDd /Z7

) อื่น (

Echo INFO: การตั้งค่าสภาพแวดล้อมโหมดรีลีส

ตั้งค่า OPTFLAGS=/O2

ตั้งค่า CCFLAGS=!OPTFLAGS! /นพ

ตอนนี้เกือบจะเป็นบล็อกแบบ if-then-else เต็มรูปแบบแล้ว เกือบแล้ว เพราะหากคุณพบวงเล็บปิดในคำสั่ง echo คำสั่งใดคำสั่งหนึ่ง คุณจะต้องหลีกเลี่ยงคำสั่งนั้นด้วยอักขระ ^ มิฉะนั้น parser จะสับสน...

แต่ไม่ว่าในกรณีใด นี่ยังดีกว่าจำนวนแท็กและการเปลี่ยนภาพที่บ้าคลั่งมาก

ฟังก์ชั่น

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

มีไวยากรณ์พิเศษสำหรับคำสั่ง call ซึ่งช่วยให้คุณไปที่เครื่องหมายในไฟล์ bat เดียวกันโดยจดจำตำแหน่งที่เกิดการโทรนี้:

โทร: อาร์กิวเมนต์ป้ายกำกับ

ฟังก์ชั่นส่งคืนด้วยคำสั่ง:

exit /b [รหัสส่งคืนทางเลือก]

ที่นี่คีย์ /b มีความสำคัญมาก: หากไม่มีมัน คุณจะออกจากฟังก์ชันไม่ได้ แต่จะออกจากสคริปต์โดยทั่วไป

สำหรับรายละเอียด ให้พิมพ์ที่บรรทัดคำสั่ง:

เรียก/?

ออก /?

สิ่งที่น่าสนใจคือคำสั่ง call ที่มีไวยากรณ์นี้รองรับ โทรซ้ำกับ การสร้างอัตโนมัติเฟรมใหม่สำหรับอาร์กิวเมนต์ตัวแปร %0-%9 บางครั้งสิ่งนี้อาจมีประโยชน์ นี่คือตัวอย่างคลาสสิกของการคำนวณแฟคทอเรียลแบบเรียกซ้ำในภาษาคำสั่ง:

@ปิดเสียงสะท้อน

โทร:แฟกทอเรียล %1

สะท้อน %ผลลัพธ์%

ออก

rem ฟังก์ชันคำนวณค่าแฟกทอเรียล

เข้าสู่ระบบ:

rem %1 จำนวนที่คุณต้องการคำนวณแฟกทอเรียล

รีมเอาท์พุต:

rem %ผลลัพธ์% ค่าแฟกทอเรียล

:แฟกทอเรียล

ถ้า %1 == 0 (

ตั้งค่าผลลัพธ์=1

ออก /ข

ถ้า %1 == 1 (

ตั้งค่าผลลัพธ์=1

ออก /ข

ตั้งค่า /a พารามิเตอร์=%1 - 1

โทร:แฟคทอเรียล %PARAM%

ตั้งค่า /a ผลลัพธ์=%1 * %ผลลัพธ์%

ออก /ข

ตัวอย่างงาน:

> แฟคทอเรียล.bat 10

3628800

การใช้ค่าส่งคืน
(กำลังประมวลผลรหัสทางออกของโปรแกรม)

เมื่อโปรแกรมใดทำงานเสร็จสิ้น มันจะส่งคืนโค้ดการสิ้นสุดไปยังระบบปฏิบัติการ เป็นธรรมเนียมที่จะต้องคืนค่าศูนย์เมื่อดำเนินการเสร็จสิ้น มิฉะนั้นจะส่งรหัสข้อผิดพลาด บางครั้งหรือบ่อยครั้งที่โปรแกรม "จงใจ" ส่งกลับค่าที่ไม่ใช่ศูนย์ เพื่อให้สามารถ "เรียนรู้" รายละเอียดการทำงานของโปรแกรมในไฟล์แบตช์ได้ ตัวอย่างเช่น โปรแกรมส่งคืนรหัสของคีย์ที่กด และไฟล์ .bat จะดำเนินการต่างๆ ตามนั้น

ไฟล์แบตช์จะค้นหารหัสทางออกของโปรแกรมที่รันได้อย่างไร? ตัวแปรคีย์ ERRORLEVEL มีไว้เพื่อจุดประสงค์นี้

ตัวอย่างไฟล์แบตช์ที่มีระดับข้อผิดพลาด:

@ปิดเสียงสะท้อน

REM รันโปรแกรม prg1.exe

PRG1.EXE

การวิเคราะห์รหัสความสมบูรณ์ REM

หากระดับข้อผิดพลาด 2 ไปที่ไฟล์ไม่พบ

หากระดับข้อผิดพลาด 1 ไปที่ผู้เขียน

หากระดับข้อผิดพลาด 0 ไปที่ EXITOK

ไปที่ ONEXIT

:ไฟล์ไม่พบ

ข้อผิดพลาดเอคโค่! ไม่พบไฟล์!

ไปที่ ONEXIT

:นักเขียน

ข้อผิดพลาดในการบันทึก ECHO!

ไปที่ ONEXIT

:ออก

ECHO โปรแกรมเสร็จสมบูรณ์เรียบร้อยแล้ว

ไปที่ ONEXIT

:ONEXIT

โปรดทราบว่าการวิเคราะห์รหัสทางออกไม่ได้เริ่มต้นจากศูนย์ แต่จากค่าสูงสุดที่เป็นไปได้ ความจริงก็คือการตรวจสอบดังกล่าวหมายถึง: “ถ้าระดับข้อผิดพลาดมากกว่าหรือเท่ากับค่าแล้ว...” นั่นคือถ้าเราตรวจสอบโดยเริ่มจากศูนย์ ค่าใดๆ ก็ตามในบรรทัดแรกจะเป็นจริงซึ่งไม่ถูกต้อง

นี่เป็นข้อผิดพลาดที่พบบ่อยที่สุดในโปรแกรมประเภทนี้

ภายในไฟล์คำสั่ง คุณสามารถทำงานกับสิ่งที่เรียกว่าตัวแปรสภาพแวดล้อม (หรือตัวแปรสภาพแวดล้อม) ซึ่งแต่ละตัวจะถูกเก็บไว้ แรมมีชื่อเฉพาะของตัวเอง และค่าของมันคือสตริง ตัวแปรสภาพแวดล้อมมาตรฐานจะเริ่มต้นโดยอัตโนมัติในระหว่างกระบวนการบู๊ต ระบบปฏิบัติการ- ตัวแปรดังกล่าว เช่น WINDIR ซึ่งกำหนดตำแหน่ง ไดเร็กทอรีวินโดวส์, TEMP ซึ่งระบุเส้นทางไปยังไดเร็กทอรีหน่วยเก็บข้อมูล ไฟล์ชั่วคราว Windows หรือ PATH ซึ่งเก็บเส้นทางของระบบ (เส้นทางการค้นหา) นั่นคือรายการไดเร็กทอรีที่ระบบควรค้นหาไฟล์ปฏิบัติการหรือไฟล์ การแบ่งปัน(ตัวอย่างเช่น, ไลบรารีแบบไดนามิก- นอกจากนี้ในแบตช์ไฟล์ที่ใช้ คำสั่ง SETคุณสามารถประกาศตัวแปรสภาพแวดล้อมของคุณเองได้

รับค่าของตัวแปร

เพื่อให้ได้ค่าที่แน่นอน ตัวแปรสภาพแวดล้อมคุณต้องใส่ชื่อของตัวแปรนี้ด้วยสัญลักษณ์ % ตัวอย่างเช่น:

@ECHO OFF CLS REM สร้างตัวแปร MyVar SET MyVar=Hello REM เปลี่ยนตัวแปร SET MyVar=%MyVar%! ค่าตัวแปร ECHO MyVar: %MyVar% REM การลบตัวแปร MyVar SET MyVar= ค่าตัวแปร ECHO WinDir: %WinDir%

เมื่อคุณเรียกใช้แบตช์ไฟล์ บรรทัดจะปรากฏบนหน้าจอ

ค่าตัวแปร MyVar: สวัสดี! ค่าตัวแปร WinDir: C:\WINDOWS

การแปลงตัวแปรเป็นสตริง

คุณสามารถจัดการตัวแปรสภาพแวดล้อมในไฟล์แบตช์ได้ด้วยวิธีบางอย่าง ประการแรกการดำเนินการต่อข้อมูล (การติดกาว) สามารถทำได้ ในการดำเนินการนี้คุณเพียงแค่ต้องเขียนค่าของตัวแปรที่เชื่อมต่อไว้ติดกันในคำสั่ง SET ตัวอย่างเช่น,

ชุด A=หนึ่งชุด B=สองชุด C=%A%%B%

หลังจากดำเนินการคำสั่งเหล่านี้ในไฟล์ ค่าของตัวแปร C จะเป็นสตริง "Double" คุณไม่ควรใช้เครื่องหมาย + ในการต่อข้อมูล เนื่องจากจะตีความได้ว่าเป็นสัญลักษณ์เท่านั้น เช่น หลังจากรันไฟล์โดยมีเนื้อหาดังนี้

SET A=หนึ่งชุด B=สอง ชุดC=A+B ตัวแปรECHO C=%C% SET D=%A%+%B% ตัวแปรECHO D=%D%

สองบรรทัดจะปรากฏบนหน้าจอ:

ตัวแปร C=A+B ตัวแปร D=หนึ่ง+สอง

ประการที่สอง คุณสามารถแยกสตริงย่อยออกจากตัวแปรสภาพแวดล้อมได้โดยใช้โครงสร้าง %ชื่อตัวแปร:~n1,n2%โดยที่ตัวเลข n1 กำหนดออฟเซ็ต (จำนวนอักขระที่จะข้าม) จากจุดเริ่มต้น (หาก n1 เป็นบวก) หรือจากจุดสิ้นสุด (หาก n1 เป็นลบ) ของตัวแปรสภาพแวดล้อมที่เกี่ยวข้อง และตัวเลข n2 คือจำนวน อักขระที่จะจัดสรร (หาก n2 เป็นค่าบวก) หรือตัวเลข อักขระตัวสุดท้ายในตัวแปรที่จะไม่รวมไว้ในสตริงย่อยที่เลือก (หาก n2 เป็นลบ) หากมีการระบุตัวเลือกลบ -n เพียงตัวเดียว อักขระ n ตัวสุดท้ายจะถูกแยกออกมา ตัวอย่างเช่น หากตัวแปร %DATE% เก็บสตริง "09/21/2007" (การแสดงเชิงสัญลักษณ์ของวันที่ปัจจุบันในการตั้งค่าภูมิภาคบางอย่าง) จากนั้นหลังจากดำเนินการคำสั่งต่อไปนี้

SET dd1=%DATE:~0.2% SET dd2=%DATE:~0.-8% SET mm=%DATE:~-7.2% SET yyyy=%DATE:~-4%

ตัวแปรใหม่จะมีค่าดังต่อไปนี้: %dd1%=21, %dd2%=21, %mm%=09, %ปปปป%=2007.

ประการที่สาม คุณสามารถดำเนินการขั้นตอนการเปลี่ยนสตริงย่อยได้โดยใช้โครงสร้าง %ตัวแปร_ชื่อ:s1=s2%(สิ่งนี้จะส่งคืนสตริงพร้อมกับสตริงย่อยทุกครั้ง s1 ในตัวแปรสภาพแวดล้อมที่เกี่ยวข้องแทนที่ด้วย s2 ) เช่น หลังจากดำเนินการตามคำสั่งแล้ว

SET a=123456 SET b=%a:23=99%

ตัวแปร b จะเก็บสตริง "199456" หากไม่ได้ระบุพารามิเตอร์ s2 สตริงย่อย s1 จะถูกลบออกจากสตริงเอาต์พุต กล่าวคือ หลังจากดำเนินการคำสั่ง

เซต ก=123456 เซต ข=%a:23=%

ตัวแปร b จะเก็บสตริง "1456"

การดำเนินการกับตัวแปรเช่นเดียวกับตัวเลข

เมื่อเปิดใช้งานการประมวลผลคำสั่งขั้นสูง (โหมดเริ่มต้นใน Windows XP) คุณสามารถถือว่าค่าตัวแปรสภาพแวดล้อมเป็นตัวเลขและทำการคำนวณทางคณิตศาสตร์ได้ เมื่อต้องการทำเช่นนี้ ใช้คำสั่ง SET กับสวิตช์ /A นี่คือตัวอย่างของไฟล์แบตช์ add.bat ที่เพิ่มตัวเลขสองตัวที่กำหนดเป็นพารามิเตอร์บรรทัดคำสั่ง และแสดงผลรวมผลลัพธ์บนหน้าจอ:

@ECHO OFF REM ตัวแปร M จะเก็บผลรวม SET /A M=%1+%2 ECHO ผลรวมของ %1 และ %2 เท่ากับ %M% REM ลบตัวแปร M SET M=

การเปลี่ยนแปลงในท้องถิ่นตัวแปร

การเปลี่ยนแปลงใดๆ ที่คุณทำกับตัวแปรสภาพแวดล้อมในไฟล์คำสั่งโดยใช้คำสั่ง SET จะยังคงอยู่หลังจากไฟล์ออก แต่จะมีผลเฉพาะภายในหน้าต่างคำสั่งปัจจุบันเท่านั้น นอกจากนี้ยังสามารถแปลการเปลี่ยนแปลงตัวแปรสภาพแวดล้อมภายในแบตช์ไฟล์ได้ กล่าวคือ เพื่อกู้คืนค่าของตัวแปรทั้งหมดโดยอัตโนมัติเหมือนก่อนที่จะเปิดตัวไฟล์ มีการใช้คำสั่งสองคำสั่งสำหรับสิ่งนี้: SETLOCAL และ ENDLOCAL คำสั่ง SETLOCAL กำหนดจุดเริ่มต้นของพื้นที่ การติดตั้งในท้องถิ่นตัวแปรสภาพแวดล้อม กล่าวอีกนัยหนึ่ง การเปลี่ยนแปลงสภาพแวดล้อมที่เกิดขึ้นหลังจากการรัน SETLOCAL จะถูกบันทึกไว้ในไฟล์แบตช์ปัจจุบัน คำสั่ง SETLOCAL แต่ละคำสั่งต้องมีคำสั่ง ENDLOCAL ที่สอดคล้องกันเพื่อเรียกคืนค่าตัวแปรสภาพแวดล้อมก่อนหน้า การเปลี่ยนแปลงสภาพแวดล้อมที่เกิดขึ้นหลังจากดำเนินการคำสั่ง ENDLOCAL จะไม่อยู่ในไฟล์แบตช์ปัจจุบันอีกต่อไป ค่าก่อนหน้าของพวกเขาจะไม่ถูกเรียกคืนเมื่อดำเนินการไฟล์นี้เสร็จสิ้น

ตัวแปรสภาพแวดล้อมที่ใช้ในไฟล์แบตช์ (คำสั่ง) ทำให้สามารถหลีกเลี่ยงการระบุได้ เส้นทางที่แน่นอนไปยังไดเร็กทอรี เช่น ถ้าเราไม่รู้จดหมายล่วงหน้า ดิสก์ระบบเราสามารถใช้ตัวแปรได้ตลอดเวลา %ไดรฟ์ระบบ%ซึ่งส่งคืนอักษรระบุไดรฟ์ที่ติดตั้งระบบปฏิบัติการไว้ นอกจากนี้ ตัวแปรยังใช้ในการปรับโค้ดให้เหมาะสม - พารามิเตอร์ที่ทำซ้ำซ้ำๆ (เช่น รีจิสตรีคีย์) สามารถกำหนดตัวแปรแบบสั้นและนำไปใช้ได้ บทความนี้จะกล่าวถึงในรายละเอียด เทคนิคต่างๆการทำงานกับตัวแปรตลอดจนวิธีการเปลี่ยนแปลงและสร้างตัวแปรใหม่ ตอนนี้เรามาพูดถึงทุกอย่างตามลำดับ

การจำแนกประเภทของตัวแปรสภาพแวดล้อม

ประวัติย่อ

ทีม เปลือกหน้าต่าง(cmd.exe) ค่อนข้างมาก เครื่องมืออันทรงพลังทำงานกับระบบ ไฟล์แบตช์สามารถทำงานอัตโนมัติในจำนวนที่พอเหมาะ ซึ่งเป็นสาเหตุว่าทำไมไฟล์เหล่านี้ถึงคุ้นเคย การติดตั้งอัตโนมัติหน้าต่าง การใช้ตัวแปรอย่างชำนาญในไฟล์แบตช์ช่วยให้คุณสามารถแก้ไขปัญหาได้หลากหลาย การทำงานกับเชลล์คำสั่งจะมีประสิทธิภาพมากขึ้นและในขณะเดียวกันโค้ดของไฟล์แบตช์ก็ง่ายขึ้น คุณสามารถดูตัวอย่างอื่นๆ ของการใช้ตัวแปรได้ที่หน้าเว็บไซต์หรือฟอรั่ม ตัวอย่างทั้งหมดที่ใช้ในบทความนี้นำมาจากสคริปต์ของผู้เข้าร่วมซึ่งต้องขอบคุณพวกเขามาก

คำศัพท์เฉพาะทาง

เชลล์คำสั่ง- นี่แยกจากกัน ผลิตภัณฑ์ซอฟต์แวร์ซึ่งให้การสื่อสารโดยตรงระหว่างผู้ใช้และระบบปฏิบัติการ ข้อความ ส่วนต่อประสานกับผู้ใช้บรรทัดคำสั่งจัดเตรียมสภาพแวดล้อมที่แอปพลิเคชันและ สาธารณูปโภคด้วยส่วนต่อประสานข้อความ

cmd.exe- ล่ามคำสั่งนั้น เชลล์คำสั่ง Windows OS ใช้เพื่อแปลคำสั่งที่ป้อนเป็นรูปแบบที่ระบบเข้าใจ

เซสชั่นของทีมสามารถเริ่มต้นได้โดยการเปิดตัว cmd.exeและโดยการรันแบตช์ไฟล์ กล่าวอีกนัยหนึ่ง เชลล์คำสั่งปัจจุบันจะถูกสร้างขึ้น ดังนั้น การออกจากเชลล์นี้ (เช่น การจบแบตช์ไฟล์) จะเป็นการสิ้นสุดเซสชันคำสั่ง

เซสชันผู้ใช้(เซสชันผู้ใช้) เริ่มต้นเมื่อผู้ใช้เข้าสู่ระบบ (เข้าสู่ระบบ) และสิ้นสุดเมื่อผู้ใช้ออกจากระบบ (ออกจากระบบ)

    ทีม ชุดใช้เพื่อดูและเปลี่ยนแปลงตัวแปรสภาพแวดล้อมในบรรทัดคำสั่งของ Windows ตัวแปรสภาพแวดล้อมคือตัวแปรที่มีค่าที่ยอมรับซึ่งแสดงลักษณะของสภาพแวดล้อมที่ โปรแกรมปัจจุบัน- วิธี ไฟล์ระบบ, ข้อมูลฮาร์ดแวร์, ไดเร็กทอรีผู้ใช้ ฯลฯ ค่าตัวแปรสภาพแวดล้อมจะถูกสร้างขึ้นในระหว่างกระบวนการ บูตวินโดวส์, การลงทะเบียนผู้ใช้ในระบบเมื่อดำเนินการ กระบวนการส่วนบุคคลหรือใช้คำสั่ง ชุด- หากต้องการดูค่าที่ตัวแปรเฉพาะรับไว้ คุณสามารถใช้คำสั่ง:

ตัวแปร SET
กำหนดเส้นทาง- แสดงค่าของตัวแปร เส้นทาง
หากต้องการสร้างตัวแปรใหม่หรือเปลี่ยนค่าของตัวแปรที่มีอยู่ ให้ใช้คำสั่ง:

SET ตัวแปร = สตริง

ตัวแปร- ชื่อตัวแปรสภาพแวดล้อม
เส้น- สตริงอักขระที่กำหนดให้กับตัวแปรที่ระบุ

SET MyName=วาสยา- ตั้งค่าของตัวแปร ชื่อของฉัน

เส้นทาง SET=C:\progs;%เส้นทาง%- เปลี่ยนค่าของตัวแปร เส้นทางโดยการเพิ่มที่จุดเริ่มต้นของบรรทัด ซี:\progs

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

วันที่เอคโค่- จะแสดงคำว่า date และคำสั่ง
เสียงสะท้อน %วันที่%จะแสดงค่าของตัวแปร วันที่, เช่น. วันที่ปัจจุบันในรูปแบบระบบปฏิบัติการ

ทีม ชุดไม่มีพารามิเตอร์ใช้เพื่อแสดงค่าปัจจุบันของตัวแปรสภาพแวดล้อม

ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\Usr\AppData\Roaming
CommonProgramFiles=ไฟล์ C:\Program Files\Common
ชื่อคอมพิวเตอร์=การทดสอบ7
ComSpec=C:\windows\system32\cmd.exe
FP_NO_HOST_CHECK=ไม่ใช่
โฮมไดรฟ์=C:
HOMEPATH=\Users\Usr
LOCALAPPDATA=C:\Users\Usr\AppData\Local
LOGONSERVER=\\TEST7
NUMBER_OF_PROCESSORS=2
ระบบปฏิบัติการ=Windows_NT
เส้นทาง=C:\windows\system32;C:\windows;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS; .VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 ตระกูล 15 รุ่น 3 Stepping 4, ของแท้ Intel
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=0304
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\windows\system32\Windows PowerShell\v1.0\Modules\
สาธารณะ=C:\Users\Public
SystemDrive=C:
SystemRoot=C:\windows
TEMP=C:\Users\Usr\AppData\Local\Temp
TMP=C:\Users\Usr\AppData\Local\Temp
ผู้ใช้โดเมน=ทดสอบ7
USERNAME=เรา
USERPROFILE=C:\Users\Usr
windir=C:\windows

นอกจากตัวแปรที่แสดงในรายการเมื่อเรียกใช้คำสั่ง SET แล้วยังมีตัวแปรอื่น ๆ ที่มีค่าเปลี่ยนแปลงแบบไดนามิก:

%ซีดี%- รับค่า ไดเรกทอรีปัจจุบัน.
%วันที่%- รับค่าของวันที่ปัจจุบัน
%เวลา%- ใช้ค่าของเวลาปัจจุบัน
%สุ่ม%- ความหมาย หมายเลขสุ่มในช่วงระหว่าง 0 ถึง 32767
%ระดับข้อผิดพลาด%- ปัจจุบัน ค่าระดับข้อผิดพลาดซึ่งเป็นตัวแปรพิเศษที่ใช้เป็นตัวบ่งชี้ผลลัพธ์ของการทำงานของโปรแกรม
%CMDEXTVERSION% CMD.EXE ขยายค่าเวอร์ชันการประมวลผลคำสั่ง
%CMDCMDLINE%- ขยายเป็นบรรทัดคำสั่งดั้งเดิมที่เรียกว่าเชลล์

หากคุณระบุเพียงบางส่วนของชื่อเมื่อเรียกใช้คำสั่ง SET รายการตัวแปรที่มีชื่อขึ้นต้นด้วยสตริงที่ระบุจะปรากฏขึ้น ตัวอย่างเช่น:

เซ็ท ยู- จะแสดงค่าของตัวแปรทั้งหมดที่ชื่อขึ้นต้นด้วย "U"

คำสั่ง SET รองรับสวิตช์เพิ่มเติมสองตัว:

นิพจน์ SET /A

SET /P ตัวแปร=

สวิตช์/Aระบุว่าสตริงทางด้านขวาของเครื่องหมายเท่ากับคือนิพจน์ตัวเลขที่มีค่ากำลังถูกประเมิน เอ็นจิ้นนิพจน์นั้นเรียบง่ายมากและรองรับการดำเนินการต่อไปนี้ โดยเรียงลำดับตามลำดับความสำคัญจากมากไปหาน้อย:

เมื่อใช้ตัวดำเนินการเชิงตรรกะหรือไบนารี คุณต้องใส่สตริงนิพจน์ในเครื่องหมายคำพูด สตริงที่ไม่ใช่ตัวเลขในนิพจน์จะถือเป็นชื่อตัวแปรสภาพแวดล้อมที่มีค่าจะถูกแปลงเป็นรูปแบบตัวเลขก่อนใช้งาน หากตัวแปรที่มีชื่อที่ระบุไม่ได้ถูกกำหนดไว้ในระบบ ค่าว่างจะถูกแทนที่แทน สิ่งนี้ทำให้คุณสามารถดำเนินการได้ การดำเนินการทางคณิตศาสตร์ด้วยค่าตัวแปรสภาพแวดล้อม โดยไม่ต้องใส่เครื่องหมาย % เพื่อรับค่า ถ้า SET /A ถูกเรียกจากบรรทัดคำสั่ง แทนที่จะเรียกจากแบตช์ไฟล์ จะพิมพ์ค่าสุดท้ายของนิพจน์ ชื่อของตัวแปรสภาพแวดล้อมจะต้องปรากฏทางด้านซ้ายของตัวดำเนินการที่ได้รับมอบหมาย ค่าตัวเลขจะถือเป็นทศนิยม เว้นแต่จะมีคำนำหน้า:

0x- สำหรับเลขฐานสิบหก
0 - สำหรับ เลขฐานแปด.

ตัวอย่างการใช้คำนำหน้า:

SET /A เรซ=0xA+012
เสียงสะท้อน %เรซ%

ในแบตช์ไฟล์นี้ ค่าของตัวแปรคือ เรซคำนวณโดยการบวกเลข 10 แทนเลขฐานสิบหก (0xA) และเลข 10 แทนเลขฐานแปด (012)

สวิตช์ /P ช่วยให้คุณตั้งค่าของตัวแปรสำหรับสตริงอินพุตที่ผู้ใช้ป้อน แสดงพร้อมต์ promptString ที่ระบุก่อนที่จะอ่านสตริงที่ป้อน พรอมต์ promptString อาจว่างเปล่า กุญแจดอกนี้ช่วยให้คุณจัดระเบียบบทสนทนากับผู้ใช้ในแบตช์ไฟล์:

@ปิดเสียงสะท้อน
SET /P NAME=กรอกชื่อผู้ใช้:
SET /P pass=ป้อนรหัสผ่าน:
ชื่อผู้ใช้ ECHO - %NAME% , รหัสผ่าน - %PASS%

ในไฟล์แบตช์ บ่อยครั้งที่คุณต้องทำงานกับค่าส่วนหนึ่งของตัวแปรที่ตัวแปรใช้ ซึ่งคุณใช้ค่าทดแทน:

ตัวแปร:string1=string2- แทนที่ค่าที่ได้รับของตัวแปร บรรทัดที่ 1บน บรรทัดที่ 2

ต่อไป ไฟล์แบตช์ใช้การแทนที่อักขระจุดด้วยอักขระเส้นประในค่าตัวแปรที่สอดคล้องกับวันที่ปัจจุบัน:

@ปิดเสียงสะท้อน
ตั้ง tm=%DATE%
ECHO วันที่ 1 = %tm%
SET tm=%วันที่:.=-%
ECHO วันที่ 2 = %tm%

เพื่อเน้นส่วนหนึ่งของค่าที่ตัวแปรใช้ โครงสร้างต่อไปนี้จะถูกนำมาใช้:

ตัวแปร:~x,y- ที่ไหน x- จำนวนอักขระที่ข้ามตั้งแต่ต้นบรรทัด และ - จำนวนตัวอักษรที่ใช้เป็นค่าของตัวแปร

ตัวอย่างต่อไปนี้ใช้การแสดงเวลาปัจจุบันโดยไม่มีวินาทีและเศษส่วนวินาที (เฉพาะอักขระ 5 ตัวแรกของ ค่ามาตรฐานตัวแปรเวลา):

@ปิดเสียงสะท้อน
ตั้งค่า tm=%TIME%
เวลาเอคโค่1 = %tm%
ตั้ง tm=%เวลา:~0.5%
เวลาเอคโค่2 = %tm%

หากมีค่า (ความยาว) ไม่ได้ระบุ ดังนั้นค่าของตัวแปรคงเหลือจนถึงจุดสิ้นสุดของบรรทัดจะถูกใช้ หากมีค่า เป็นลบ จากนั้นส่วนหนึ่งของสตริงค่าตัวแปรจากส่วนท้ายจะถูกใช้ ตัวอย่างก่อนหน้านี้สามารถแก้ไขได้เพื่อระบุว่าค่าเวลาที่ได้รับถูกแยกอักขระ 6 ตัวจากจุดสิ้นสุด:

@ปิดเสียงสะท้อน
ตั้งค่า tm=%TIME%
เวลาเอคโค่1 = %tm%
SET tm=%เวลา:~0.-6%
เวลาเอคโค่2 = %tm%

เป็นไปได้ที่จะใช้จำนวนช่องว่างที่ไม่ได้ระบุและใช้จำนวนลบจากนั้นค่าที่ได้รับจะเป็นส่วนหนึ่งของตัวแปรจากท้ายบรรทัด:

%เส้นทาง:~-10%- จะแยกอักขระ 10 ตัวสุดท้ายของตัวแปร PATH

ค่าว่างสามารถละเว้นได้ โดยคงรูปแบบการทดแทนไว้:

%เส้นทาง:~0.-2%เทียบเท่า %เส้นทาง:~,-2%

เมื่อใช้ ตัวแปรสภาพแวดล้อมในไฟล์แบตช์ มีข้อจำกัดบางประการที่เกี่ยวข้องกับความจริงที่ว่าค่าที่กำหนดยังคงไม่เปลี่ยนแปลงเมื่อมีการแก้ไขภายในกลุ่มคำสั่งที่ระบุด้วยวงเล็บ เช่น ในคำสั่ง ถ้าหรือ สำหรับ- เพื่อเลี่ยง ข้อจำกัดนี้มีการใช้การเปิดตัว โปรเซสเซอร์คำสั่งด้วยพารามิเตอร์ /V:ON และแทนเครื่องหมายเปอร์เซ็นต์ เพื่อรับค่าที่ได้รับ ตัวแปรค่าถูกนำมาใช้ เครื่องหมายอัศเจรีย์- นอกจากนี้ยังสามารถใช้งานได้ เปิดตัวมาตรฐานโปรเซสเซอร์คำสั่ง แต่ด้วย การเปิดใช้งานในท้องถิ่น โหมดนี้สั่งการ:

ความแตกต่างในผลลัพธ์ของการใช้ค่าตัวแปรแสดงให้เห็นอย่างชัดเจนโดยไฟล์แบตช์ต่อไปนี้:


@ปิดเสียงสะท้อน
ตั้ง VAR=ก่อน
ถ้า "%VAR%" == "ก่อน" (
ตั้ง VAR=หลัง
ถ้า "!VAR!" == "after" @echo ด้วยเครื่องหมายเปอร์เซ็นต์=%VAR% พร้อมเครื่องหมายคำถาม=!VAR!

ทีม ตั้ง VAR=หลังดำเนินการภายในรูทีนย่อยที่คั่นด้วยวงเล็บ และหากคำสั่งถูกลบออก ตั้งค่า Local EnableDelayedExpansionหรือไม่ใช้เพื่อรับค่าของตัวแปร วีเออาร์เครื่องหมายอัศเจรีย์ ค่าของมันจะยังคงเป็นค่าเดิม (สิ่งที่ถูกกำหนดไว้ก่อนที่จะเข้าสู่รูทีนย่อย) ปัญหาที่คล้ายกันเกิดขึ้นเมื่อค่าของตัวแปรมีการเปลี่ยนแปลงภายในลูปคำสั่ง สำหรับ- ตัวอย่างเช่น หากต้องการดูรายการไฟล์ในไดเร็กทอรีปัจจุบัน ไฟล์แบตช์ลักษณะนี้จะใช้งานไม่ได้:

ตั้งค่ารายการ=
สำหรับ %%i ใน (*) ให้ตั้งค่า LIST=%LIST% %%i
สะท้อน %รายการ%

ค่าตัวแปร รายการจะไม่ถูกเปลี่ยนแปลงภายในลูป เพื่อให้สิ่งนี้เกิดขึ้น จำเป็นต้องแก้ไขไฟล์แบตช์ดังต่อไปนี้:

ตั้งค่า Local EnableDelayedExpansion
ตั้งค่ารายการ=
สำหรับ %%i ใน (*) ให้ตั้งค่า LIST=!LIST! %%ฉัน
สะท้อน %รายการ%

ตอนนี้ค่าของตัวแปร รายการภายในวง สำหรับจะเปลี่ยนไปตามค่าของชื่อไฟล์ที่คั่นด้วยช่องว่าง ( ตั้งค่า LIST=!LIST! %%ฉัน)