ภายในไฟล์คำสั่ง คุณสามารถทำงานกับสิ่งที่เรียกว่าตัวแปรสภาพแวดล้อม (หรือ ตัวแปรสภาพแวดล้อม) ซึ่งแต่ละรายการจะถูกเก็บไว้ใน แรมมีชื่อเฉพาะของตัวเอง และค่าของมันคือสตริง ตัวแปรสภาพแวดล้อมมาตรฐานจะเริ่มต้นโดยอัตโนมัติเมื่อระบบปฏิบัติการบู๊ต ตัวแปรดังกล่าว เช่น 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/batสคริปต์ หน้าต่างในแบบที่เราต้องการ ไม่ใช่วิธีที่ระบบปฏิบัติการมอบให้เรา
ตัวอย่างเช่น หากต้องการเพิ่มข้อมูลนี้ลงในไฟล์บันทึก หากต้องการบันทึกเวลาหรือวันที่ของเหตุการณ์ ให้สร้างไฟล์ที่มีชื่อที่ควรมีข้อมูลวันที่หรือเวลา (วัน เดือน ปี ชั่วโมง นาที วินาที มิลลิวินาที ) คุณไม่มีทางรู้หรอกว่างานของเราคืออะไร... มาใช้จินตนาการของเรากันเถอะ :)
ในตัวอย่างต่อไปนี้ เราจะเห็นการแจกแจงตัวแปรตามรูปแบบที่เราต้องการ
ชั่วโมง- ชั่วโมง 2 หลัก (คือชั่วโมงจะระบุมา) แบบฟอร์มต่อไปนี้ - 01, 02, ..., 09, ... , 12, ... 24)
ม. - นาที 2 ตัวอักษร
s - วินาที 2 สัญญาณ
ms - มิลลิวินาที 2 หลัก ด้วยเหตุผลบางประการตั้งแต่ 0 ถึง 99
dd - สัญญาณวันที่ 2
มม. - เดือน 2 ตัวอักษร
ปปปป - ปี 4 หลัก
ตัวอย่างการใช้ตัวแปร %วันที่%และ %เวลา%ในสคริปต์ คำสั่ง / ค้างคาวหน้าต่าง:
@ปิดเสียงสะท้อน
ตั้งชั่วโมง=%เวลา:~0.2%
ตั้ง ม.=%เวลา:~3.2%
ตั้งค่า s=%เวลา:~6.2%
ตั้งค่า ms=%เวลา:~9.2%
ตั้งค่าเคอร์ไทม์=%h%:%m%:%s%:%ms%
ตั้ง dd=%วันที่:~0.2%
ตั้ง มม.=%วันที่:~3.2%
ตั้ง ปปปป=%วันที่:~6.4%
ตั้ง curdate=%dd%-%mm%-%yyyy%
ตั้งค่า curdatetime=%curdate% %curtime%
echo เวลาปัจจุบันคือ %curdatetime%
ในบางเวอร์ชั่น รูปแบบวินโดวส์วันที่และเวลาออกจะแตกต่างกันดังนั้น สคริปต์นี้สามารถทำงานได้ตรงตามที่เราต้องการ
ตามทฤษฎี คุณสามารถแยกส่วนของตัวแปรใดๆ ก็ได้ในลักษณะเดียวกัน ประเด็นก็คือ รูปแบบที่นี่จะเป็นดังนี้:
หลักแรกหลังจาก: ~ คือจำนวนอักขระที่เราเริ่มรับค่า หลักที่สองคือจำนวนอักขระที่จะจับ
ดังนั้นปรากฎว่าเราสามารถรับส่วนใดส่วนหนึ่งของตัวแปรสภาพแวดล้อม Windows ที่มีอยู่สำหรับความต้องการของเราได้
ฉันรู้ตัวแปรต่อไปนี้ซึ่งมีค่าที่เราสามารถรับได้:
โปรไฟล์ผู้ใช้ทั้งหมด | ส่งกลับตำแหน่งของโปรไฟล์ "ผู้ใช้ทั้งหมด" |
ข้อมูลแอป | ส่งกลับตำแหน่งเริ่มต้นสำหรับข้อมูลแอปพลิเคชัน |
ซีดี | บ่งบอกถึงเส้นทาง โฟลเดอร์ปัจจุบัน- เหมือนกับคำสั่ง CD โดยไม่มีอาร์กิวเมนต์ |
CMDCMDLINE | คำสั่งที่แน่นอนที่ใช้ในการเริ่ม cmd.exe ปัจจุบัน |
CMDEXTVERSION | เวอร์ชันของส่วนขยายตัวประมวลผลคำสั่งปัจจุบัน |
CommonProgramFiles | ตำแหน่งของไดเร็กทอรี "Common Files" (โดยปกติจะเป็น %ProgramFiles%\Common Files) |
ชื่อคอมพิวเตอร์ | ชื่อคอมพิวเตอร์ |
คอมสเปค | เส้นทางสู่การเรียกทำงานของเชลล์ |
วันที่ | ส่งกลับวันที่ปัจจุบัน ใช้รูปแบบเดียวกับคำสั่ง date /t สร้างโดยคำสั่ง Cmd.exe |
ระดับข้อผิดพลาด | ส่งกลับรหัสข้อผิดพลาดของคำสั่งสุดท้ายที่ใช้ ความหมายไม่มี เท่ากับศูนย์มักจะแสดงว่ามีข้อผิดพลาด |
โฮมไดรฟ์ | ส่งกลับชื่อไดรฟ์ในเครื่อง เวิร์กสเตชันเชื่อมโยงกับโฮมไดเร็กตอรี่ของผู้ใช้ ตั้งค่าตามตำแหน่งของไดเร็กทอรีหลัก โฮมไดเร็กตอรี่ของผู้ใช้ถูกระบุในสแน็ปอิน " ผู้ใช้ท้องถิ่นและกลุ่ม” |
โฮมพาธ | การส่งคืน เส้นทางเต็มไปยังโฮมไดเร็กตอรี่ของผู้ใช้ ตั้งค่าตามตำแหน่งของไดเร็กทอรีหลัก โฮมไดเร็กทอรีของผู้ใช้ถูกระบุในสแนปอินผู้ใช้และกลุ่มภายในเครื่อง |
โฮมแชร์ | ส่งกลับเส้นทางเครือข่ายไปยังโฮมไดเร็กตอรี่ที่แชร์ของผู้ใช้ ตั้งค่าตามตำแหน่งของไดเร็กทอรีหลัก โฮมไดเร็กทอรีของผู้ใช้ถูกระบุในสแนปอินผู้ใช้และกลุ่มภายในเครื่อง |
เข้าสู่ระบบเซิร์ฟเวอร์ | ชื่อของตัวควบคุมโดเมนที่ใช้ในการอนุญาตผู้ใช้ปัจจุบัน |
NUMBER_OF_PROCESSORS | จำนวนโปรเซสเซอร์ในระบบ |
ระบบปฏิบัติการ | ชื่อระบบปฏิบัติการ Windows XP และ Windows 2000 ปรากฏเป็น Windows_NT |
เส้นทาง | ระบุเส้นทางการค้นหาสำหรับ ไฟล์ปฏิบัติการ. |
เส้นทาง | ส่งคืนรายการนามสกุลไฟล์ที่ระบบปฏิบัติการพิจารณาว่าสามารถเรียกใช้งานได้ |
PROCESSOR_สถาปัตยกรรม | สถาปัตยกรรมโปรเซสเซอร์ |
PROCESSOR_IDENTIFIER | คำอธิบายโปรเซสเซอร์ |
PROCESSOR_LEVEL | หมายเลขรุ่นโปรเซสเซอร์ |
PROCESSOR_REVISION | การแก้ไขโปรเซสเซอร์ |
โปรแกรมไฟล์ | เส้นทางไป โฟลเดอร์โปรแกรมไฟล์ |
พร้อมท์ | ส่งคืนตัวเลือกบรรทัดคำสั่งสำหรับล่ามปัจจุบัน สร้างโดยคำสั่ง Cmd.exe |
สุ่ม | เลขทศนิยมสุ่มตั้งแต่ 0 ถึง 32767 สร้างโดย Cmd.exe |
SESSIONNAME | ประเภทเซสชัน ค่าเริ่มต้นคือ "คอนโซล" |
ไดรฟ์ระบบ | ดิสก์ที่มันอยู่ โฟลเดอร์รูทหน้าต่าง |
ระบบรูท | เส้นทางโฟลเดอร์รูทของ Windows |
อุณหภูมิหรือ TMP | ส่งคืนโฟลเดอร์ชั่วคราวเริ่มต้นที่ใช้โดยแอปพลิเคชันที่ผู้ใช้ที่เข้าสู่ระบบสามารถเข้าถึงได้ แอปพลิเคชั่นบางตัวต้องการตัวแปร TEMP และแอปพลิเคชั่นบางตัวจำเป็นต้องใช้ตัวแปร TMP TEMP และ TMP อาจชี้ไปยังไดเร็กทอรีที่แตกต่างกัน แต่โดยปกติแล้วจะเหมือนกัน |
เวลา | ส่งกลับเวลาปัจจุบัน ใช้รูปแบบเดียวกับคำสั่ง time /t สร้างโดยคำสั่ง Cmd.exe |
โดเมนผู้ใช้ | ชื่อของโดเมนที่ผู้ใช้ปัจจุบันอยู่ |
ชื่อผู้ใช้ | ชื่อผู้ใช้ปัจจุบัน |
โปรไฟล์ผู้ใช้ | เส้นทางไปยังโปรไฟล์ของผู้ใช้ปัจจุบัน |
วินเดียร์ | ไดเร็กทอรีที่ติดตั้ง Windows |
0.00 (1 )
แนวทางทั่วไป
ไฟล์คำสั่งได้แก่ ไฟล์ข้อความมีส่วนขยาย ค้างคาวหรือ คำสั่งซึ่งมีบรรทัดแทนคำสั่งหรือชื่อของไฟล์ปฏิบัติการ เมื่อคุณเรียกใช้แบตช์ไฟล์ การควบคุมจะถูกควบคุมโดยตัวประมวลผลคำสั่งของระบบปฏิบัติการ (มักเรียกว่าตัวแปลคำสั่ง) ซึ่งจะอ่านและตีความบรรทัดในแบตช์ไฟล์ตามลำดับ สำหรับ Windows9X จะเป็นอันเสร็จสิ้น คอมมานด์.คอม, สำหรับ WinNT/2K/XP - cmd.exe- บรรทัดไฟล์แบตช์สามารถมีคำสั่งจากตัวประมวลผลคำสั่งเอง (FOR, GOTO, IF ฯลฯ ) หรือชื่อของโมดูลที่ปฏิบัติการได้ (net.exe, regedit.exe, win.com ฯลฯ ) บนระบบปฏิบัติการ WinNT/2K/XP คุณสามารถรับได้ ข้อมูลโดยย่อตามองค์ประกอบของคำสั่งโดยใช้บรรทัดคำสั่ง:
หรือตามคำสั่งเฉพาะ:
ชื่อคำสั่งช่วยเหลือ
หากต้องการแสดงข้อความช่วยเหลือที่ไม่อยู่บนหน้าจอ แต่ในไฟล์คุณสามารถใช้ การเปลี่ยนเส้นทางเอาต์พุต - เมื่อใช้บรรทัดคำสั่ง อุปกรณ์มาตรฐานอุปกรณ์อินพุตคือคีย์บอร์ดและอุปกรณ์เอาท์พุตคือจอแสดงผล อย่างไรก็ตาม อุปกรณ์เหล่านี้สามารถแมปใหม่ได้โดยใช้อักขระการเปลี่ยนเส้นทาง
< - การเปลี่ยนเส้นทางอินพุต
> - การเปลี่ยนเส้นทางเอาต์พุต (หรือ > > - การเปลี่ยนเส้นทางไปยังไฟล์ที่มีอยู่ เมื่อข้อมูลเอาต์พุตถูกต่อท้ายไฟล์)
เพื่อส่งออกสตรีมข้อมูลคำสั่ง
ช่วยในไฟล์ help.txt บรรทัดคำสั่งจะเป็นดังนี้:ช่วยเหลือ > help.txt
วิธีแสดงความช่วยเหลือสำหรับคำสั่ง GOTO ในไฟล์ goto.txt:
ช่วย GOTO > goto.txt
การใช้ตัวแปรสภาพแวดล้อม
ในไฟล์แบตช์คุณสามารถใช้ได้และบ่อยครั้ง ตัวแปรสภาพแวดล้อม - ตัวแปรที่มีค่าบ่งบอกถึงสภาพแวดล้อมที่ดำเนินการคำสั่งหรือไฟล์แบตช์ ค่าของตัวแปรสภาพแวดล้อมจะถูกสร้างขึ้นเมื่อระบบปฏิบัติการบูทและผู้ใช้ลงทะเบียนในระบบ และยังสามารถตั้งค่าได้โดยใช้คำสั่งชุดซึ่งมีรูปแบบดังนี้:
SET [ตัวแปร=[สตริง]]
ตัวแปรชื่อตัวแปรสภาพแวดล้อม
เส้นสตริงอักขระที่กำหนดให้กับตัวแปรที่ระบุ
ตัวอย่างเช่น บรรทัดคำสั่ง
SET มีนา=วาสยา
จะเพิ่มตัวแปร myname ที่ใช้ค่า Vasya
คุณสามารถรับค่าของตัวแปรในโปรแกรมและแบตช์ไฟล์ได้โดยใช้ชื่อที่ล้อมรอบด้วยเครื่องหมายเปอร์เซ็นต์ ( %) - ยกตัวอย่างคำสั่ง
จะแสดงคำว่า เวลา และคำสั่ง
จะแสดงค่าของตัวแปรเวลาซึ่งใช้ค่าของเวลาปัจจุบัน
และบรรทัดคำสั่ง
SET PATH=C:myprog;%เส้นทาง%
จะเพิ่มเส้นทางการค้นหา โปรแกรมปฏิบัติการอธิบายโดยค่าของตัวแปร PATH ซึ่งเป็นไดเร็กทอรี C:myprog
การดำเนินการคำสั่ง SET โดยไม่มีพารามิเตอร์จะทำให้ค่าปัจจุบันของตัวแปรปรากฏบนหน้าจอในรูปแบบ:
NUMBER_OF_PROCESSORS=1 - จำนวนโปรเซสเซอร์
OS=Windows_NT - ประเภทระบบปฏิบัติการ
Path=E:WINDOWSsystem32;E:WINDOWS;E:Program FilesFar - เส้นทางการค้นหาสำหรับไฟล์ปฏิบัติการ
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH - ส่วนขยายสำหรับไฟล์ปฏิบัติการ
PROCESSOR_ARCHITECTURE=x86 - สถาปัตยกรรมโปรเซสเซอร์
PROCESSOR_IDENTIFIER=x86 ตระกูล 6 รุ่น 8 Stepping 1, AuthenticAMD - ตัวระบุโปรเซสเซอร์
PROCESSOR_LEVEL=6 - ระดับโปรเซสเซอร์ (หมายเลขรุ่น)
PROCESSOR_REVISION=0801 - เวอร์ชันโปรเซสเซอร์
ProgramFiles=E:Program Files - พาธไปยังโฟลเดอร์ "Program Files"
PROMPT=$P$G - รูปแบบพรอมต์บรรทัดคำสั่ง $P - พาธสำหรับไดเร็กทอรีปัจจุบัน เครื่องหมาย $G - ">"
SystemDrive=E: - อักษรระบุไดรฟ์ของระบบ
SystemRoot=E:WINDOWS - ไดเร็กทอรีระบบปฏิบัติการ Windows
ค่าของตัวแปรบางตัวจะไม่ถูกส่งกลับโดยคำสั่ง SET เหล่านี้เป็นตัวแปรที่มีค่าเปลี่ยนแปลงแบบไดนามิก:
%CD% - รับค่าของสตริงไดเร็กทอรีปัจจุบัน
%DATE% - ยอมรับค่า วันที่ปัจจุบัน.
%TIME% - ยอมรับค่าเวลาปัจจุบัน
%RANDOM% - ยอมรับค่าของตัวเลขทศนิยมแบบสุ่มในช่วง 1 -32767
%ERRORLEVEL% - ยอมรับค่าปัจจุบันของรหัสทางออกของงาน ERRORLEVEL
%CMDEXTVERSION% - รับค่าของเวอร์ชันตัวประมวลผลคำสั่ง CMD.EXE สำหรับการประมวลผลคำสั่งแบบขยาย
%CMDCMDLINE% - รับค่าของบรรทัดที่เรียกว่าเชลล์
คุณสามารถใช้บรรทัดคำสั่งเพื่อดูค่าของตัวแปร:
เสียงสะท้อน %ตัวแปร%
พารามิเตอร์อินพุตสำหรับไฟล์แบตช์
เป็นไปได้ที่จะส่งพารามิเตอร์บรรทัดคำสั่งไปยังไฟล์คำสั่งและใช้ค่าในคำสั่งในไฟล์คำสั่งเอง
ไฟล์ BAT< параметр1 > , < параметр2 >, ... < параметрN >
ในแบตช์ไฟล์นั้น พารามิเตอร์แรกจะพร้อมใช้งานเป็นตัวแปร %1 , ที่สอง - %2 ฯลฯ ชื่อของไฟล์แบตช์นั้นสามารถใช้เป็นตัวแปรได้ %0 - ตัวอย่างเช่นเรามาสร้างไฟล์แบตช์ซึ่งมีหน้าที่แสดงค่าของพารามิเตอร์ที่ป้อนบนหน้าจอ โดยทั่วไปคำสั่งที่ใช้แสดงข้อความคือ
เอคโค่< текст >
อย่างไรก็ตาม หากแทนที่ข้อความด้วย %1 พารามิเตอร์แรกจะถูกส่งกลับ โดยมี %2 - พารามิเตอร์ตัวที่สอง เป็นต้น
สร้างไฟล์ parm.bat โดยมีเนื้อหาดังต่อไปนี้:
echo พารามิเตอร์แรก=%1
echo พารามิเตอร์ที่สอง =%2
echo พารามิเตอร์ที่สาม = %3
และรันด้วยคำสั่งต่อไปนี้:
parm.bat ครั้งแรกที่สอง “สองคำ”
หลังจากดำเนินการแล้ว คุณจะเข้าใจวิธีการทำงานและต้องใส่พารามิเตอร์ที่มีการเว้นวรรค เครื่องหมายคำพูดคู่- เพื่อนำไปแปรรูป โปรเซสเซอร์คำสั่งเส้นไม่แสดงบนหน้าจอ คุณสามารถใช้คำสั่งได้
ปิดเสียงสะท้อนโดยวางไว้ที่บรรทัดแรกของไฟล์แบตช์ หากต้องการสร้างบรรทัดในแบตช์ไฟล์ที่เชลล์ละเว้น ให้วางไว้ที่จุดเริ่มต้นของบรรทัดอาร์.อี.เอ็ม.< пробел > - วิธีนี้ทำให้คุณสามารถใส่ความคิดเห็น ซึ่งมักจะมีประโยชน์ในไฟล์แบตช์ขนาดใหญ่:rem ECHO OFF ปิดโหมดการแสดงเนื้อหาของบรรทัดไฟล์คำสั่งบนหน้าจอ
REM จะแสดงเฉพาะผลลัพธ์ของการดำเนินการเท่านั้น
echo พารามิเตอร์แรก=%1
echo พารามิเตอร์ที่สอง =%2
echo พารามิเตอร์ที่สาม = %3
ลองแทนที่ ECHO OFF ด้วย @ECHO OFF - ผลลัพธ์จะพูดเพื่อตัวมันเอง เส้นที่ปิดโหมดเอาท์พุตจะไม่แสดงบนหน้าจออีกต่อไป
การเปลี่ยนภาพและป้ายกำกับ
ในไฟล์แบตช์ คุณสามารถใช้คำสั่งข้ามแบบมีเงื่อนไขซึ่งเปลี่ยนตรรกะของการดำเนินการขึ้นอยู่กับการปฏิบัติตามเงื่อนไขบางประการ เพื่อสาธิตวิธีใช้การข้ามแบบมีเงื่อนไข เรามาสร้างไฟล์แบตช์โดยมีวัตถุประสงค์เพื่อกำหนดอักษรระบุไดรฟ์ที่กำหนดไว้ล่วงหน้าให้กับ สื่อที่ถอดออกได้ซึ่งจะใช้เป็นแฟลชไดรฟ์ เงื่อนไขมีดังนี้ - มีแฟลชไดรฟ์ 2 ตัวโดยอันหนึ่งควรมองเห็นได้ใน Explorer เป็นไดรฟ์ X: และอันที่สองเป็นไดรฟ์ Y: ไม่ว่าจะเชื่อมต่อพอร์ต USB ใดก็ตาม เราจะถือว่า ล้อจริงสามารถเชื่อมต่อเป็น F: หรือ G: เราจะระบุดิสก์โดยการมีไฟล์ที่มีชื่อที่แน่นอน (ควรซ่อนไฟล์ดังกล่าวในไดเร็กทอรีรากและตั้งชื่อให้เป็นสิ่งที่ผิดปกติ):
Flashd1.let - บนดิสก์แผ่นแรก
Flashd2.let - ในวินาที
เหล่านั้น. วัตถุประสงค์ของแบตช์ไฟล์คือเพื่อตรวจสอบการมีอยู่ของ ดิสก์แบบถอดได้ ฉ:และ กรัม:ไฟล์ Flashd1.letหรือ Flashd2.letและกำหนดอักษรระบุไดรฟ์ ทั้งนี้ขึ้นอยู่กับอันใดที่มีอยู่ เอ็กซ์:หรือ ใช่:
หากต้องการค้นหาไฟล์บนดิสก์ให้ใช้คำสั่ง
หากมีอยู่:คำสั่งชื่อไฟล์ IF EXIST
วิธีที่ง่ายที่สุดในการใช้เป็นคำสั่งคือย่อยซึ่งตรงกับชื่อไดรฟ์และไดเร็กทอรี
รายการ X: C: - สร้างไดรฟ์เสมือน X: ซึ่งเนื้อหาจะเป็นไดเร็กทอรีรากของไดรฟ์ C:
สร้างแบตช์ไฟล์ setXY.bat โดยมีบรรทัดต่อไปนี้:
หลังจากเรียกใช้ไฟล์ดังกล่าว คุณจะมีไดรฟ์ X: และ Y: แต่ถ้าคุณเรียกใช้งานไฟล์ดังกล่าวอีกครั้ง คำสั่ง SUBST จะแสดงข้อความแสดงข้อผิดพลาด - ท้ายที่สุดแล้ว ไดรฟ์ X: และ Y: มีอยู่แล้ว
ขอแนะนำให้ข้ามการดำเนินการ SUBST หากดิสก์เสมือน X: และ Y: ถูกสร้างขึ้นแล้ว (หรือลบออกโดยใช้ SUBST พร้อมด้วยพารามิเตอร์ -d ก่อนทำการติดตั้ง) แก้ไขไฟล์แบตช์โดยใช้ไป- ถ่ายโอนการควบคุมไปยังบรรทัดของไฟล์แบตช์ตามป้ายกำกับ
ป้ายกำกับ GOTO
ป้ายกำกับต้องอยู่ในบรรทัดแยกกันและขึ้นต้นด้วยเครื่องหมายทวิภาค มาทำการเปลี่ยนแปลงไฟล์แบตช์ของเราเพื่อที่เราจะได้ไม่ได้รับข้อความแสดงข้อผิดพลาด:
REM หากไม่มี X - จากนั้นไปที่ป้ายกำกับ SETX
หากไม่มี X: ไปที่ SETX
REM หากมี X: - มาดูการตรวจสอบการมีอยู่ของ Y:
หากมี G:flashd1.let SUBST X: G:
หากมีอยู่ F:flashd1.let SUBST X: F:
REM ถ้า Y: มีอยู่ - กรอกไฟล์แบตช์
หากมี Y: ไปที่ทางออก
หากมี G:flashd2.let SUBST Y: G:
หากมีอยู่ F:flashd2.let SUBST Y: F:
REM ออกจากแบตช์ไฟล์
ข้อความแสดงข้อผิดพลาด SUBST หายไป สัญญาณของข้อผิดพลาดเมื่อดำเนินการคำสั่งสามารถติดตามได้ในไฟล์คำสั่งโดยการวิเคราะห์ตัวแปรระดับข้อผิดพลาดซึ่งเป็นค่าที่เกิดขึ้นระหว่างการทำงานของโปรแกรมส่วนใหญ่ ERRORLEVEL จะเป็น 0 หากโปรแกรมเสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด และ 1 หากเกิดข้อผิดพลาด อาจมีค่าอื่น ๆ หากมีการระบุไว้ในโปรแกรมที่รัน
คุณยังสามารถใช้แบตช์ไฟล์เป็นคำสั่งในบรรทัดในแบตช์ไฟล์ได้ นอกจากนี้ ในการถ่ายโอนและกลับไปยังจุดดำเนินการของไฟล์แบตช์ที่เรียก คำสั่งจะถูกใช้เรียก- มาสร้างไฟล์คำสั่ง test.bat โดยมีเนื้อหาดังต่อไปนี้:
ECHO โทร 1.bat
เอคโค่กลับมา
และไฟล์ 1.bat ที่มีคำสั่งหยุดชั่วคราว,ระงับการดำเนินการแบตช์ไฟล์จนกว่าจะกดปุ่มใด ๆ
เมื่อรัน test.bat ข้อความจะปรากฏขึ้นบนหน้าจอ
โทร 1.ค้างคาว
และการควบคุมจะมอบให้กับ 1.bat ด้วยคำสั่งหยุดชั่วคราว หลังจากกดปุ่มบนแป้นพิมพ์แล้ว การควบคุมจะถูกส่งไปยังบรรทัดคำสั่ง “ECHO Return” และมันจะแสดงบนหน้าจอ
หากคุณลบ CALL ออกจาก test.bat การส่งคืนจากไฟล์ 1.bat จะไม่ถูกดำเนินการ อย่างไรก็ตาม ด้วยการถ่ายโอนการควบคุมไปยังไฟล์แบตช์ คุณสามารถจัดระเบียบให้เป็นลูปได้ ลองเพิ่มบรรทัดต่อไปนี้ต่อท้ายไฟล์ test.bat:
คุณสามารถแยกออกจากลูปไฟล์แบตช์ได้โดยการกด CTRL-Break คุณสามารถใช้คำสั่ง CALL เพื่อเรียกขั้นตอนภายในแบตช์ไฟล์ได้ ในกรณีนี้ ชื่อจะไม่ถูกใช้เป็นอาร์กิวเมนต์ ไฟล์ภายนอกและป้ายกำกับ:
....
โทร: proc1
....
:proc1
....
ออก
....
การสร้างไฟล์.
ไม่มีคำสั่งพิเศษใน Windows ในการสร้างไฟล์ แต่คุณสามารถทำได้โดยไม่ต้องมีหลายวิธี:
การคัดลอกจากคอนโซลไปยังไฟล์
คัดลอกคอน myfile.txt
เมื่อดำเนินการคำสั่งนี้ ข้อมูลจากแป้นพิมพ์ (อุปกรณ์ CON) จะถูกเขียนลงในไฟล์ myfile.txt กด F6 หรือ ชุดค่าผสม CTRL-Zจะทำให้เอาท์พุตเสร็จสมบูรณ์
การเปลี่ยนเส้นทางเอาต์พุต
เสียงสะท้อน 1 > myfile.txt
การรันคำสั่งนี้จะสร้างไฟล์ myfile.txt ที่มีอักขระ “1”
การรวมกันของการเปลี่ยนเส้นทางอินพุตและเอาต์พุต:
คัดลอกคอน > myfile.txt< xyz
เมื่อดำเนินการคำสั่งนี้ เช่นเดียวกับในกรณีแรก จะใช้การคัดลอกจากคอนโซลไปยังไฟล์ แต่แทนที่จะป้อนข้อมูลจากแป้นพิมพ์ จะใช้อินพุตจากอุปกรณ์ xyz ที่ไม่มีอยู่จริง ระบบจะแสดงข้อความแจ้งว่าไม่มีอุปกรณ์ดังกล่าว แต่จะสร้างไฟล์ว่าง myfile.txt ได้สำเร็จ
ตัวเลือกที่ง่ายมาก - การคัดลอกจากอุปกรณ์สมมติที่มีชื่อ ไม่มีเพื่อยื่น
คัดลอก null myfile.txt
หากคุณจำเป็นต้องสร้างไฟล์ว่างบ่อยครั้ง คุณสามารถเตรียมไฟล์แบตช์ของคุณเองได้ (เช่น - newfile.bat หรือที่ดีกว่านั้น - nf.bat) และตั้งชื่อ สร้างไฟล์ส่งผ่านเป็นพารามิเตอร์เมื่อเริ่มต้น
เนื้อหาไฟล์:
วางไฟล์แบตช์นี้ไว้ ไดเร็กทอรีระบบ(C:windowssystem32 หรืออื่นๆ ที่พบในเส้นทางการค้นหา PATH)
บรรทัดคำสั่ง:
newfile.bat myfile.txt
หรือ
nf.bat myfile.txt
หรือ
nf myfile.txt
นี่คือทีมของคุณ nfเพื่อสร้าง ไฟล์เปล่าบนบรรทัดคำสั่ง
การกำหนดอักษรระบุไดรฟ์เดียวกันให้กับไดรฟ์แบบถอดได้
ความท้าทายคือการ USB แบบถอดได้สามารถเข้าถึงไดรฟ์ (แฟลชไดรฟ์) ด้วยตัวอักษรเดียวกันเสมอ ไม่ว่าจะใช้งานกับคอมพิวเตอร์เครื่องใดหรือเชื่อมต่อด้วยวิธีใดก็ตาม เพื่อแก้ปัญหานี้ เราจะใช้คำสั่ง SUBST ที่กล่าวไปแล้วข้างต้น ให้เราเลือกตัวอักษรที่ต้องการสำหรับดิสก์แบบถอดได้ เช่น - X ชื่อของดิสก์ที่ใช้เปิดแบตช์ไฟล์จะมีให้ใช้งานเป็นตัวแปร %~d0 สร้างแบตช์ไฟล์ที่มีเนื้อหาดังต่อไปนี้: @ปิดเสียงสะท้อน
ส่วนย่อย X: %~d0
การสร้างดิสก์เสมือน X: ซึ่งเกี่ยวข้องกับอะไร ฟิสิคัลดิสก์จากตำแหน่งที่เรียกใช้ไฟล์แบตช์
สามารถรับข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับค่าการทดแทนสำหรับตัวแปร %0 ได้จากไฟล์แบตช์ต่อไปนี้:
@ปิดเสียงสะท้อน
การประมวลผลไฟล์เสียงสะท้อน - %0
ECHO วันที่/เวลาที่ไฟล์แบตช์ถูกสร้าง/แก้ไข - %~t0
เส้นทางไฟล์ ECHO แบตช์ - "%~f0"
ดิสก์ไฟล์คำสั่ง ECHO - %~d0
ไดเรกทอรีไฟล์ ECHO Batch - "%~p0"
ชื่อไฟล์แบตช์ ECHO - %~n0
นามสกุลไฟล์ ECHO แบตช์ - %~x0
ECHO ชื่อย่อและนามสกุล - %~s0
แอ็ตทริบิวต์ไฟล์แบตช์ ECHO - %~a0
ขนาดไฟล์แบตช์ ECHO - %~z0
การสร้างเอกสารสำคัญรุ่นต่างๆ ตามวันที่และเวลา
มาแก้ไขปัญหาต่อไปนี้ - เราจำเป็นต้องสร้างไฟล์เก็บถาวรที่อยู่ในไดเร็กทอรี C:Program FilesFAR ชื่อ ไฟล์เก็บถาวรควรประกอบด้วยเวลาปัจจุบัน (hour. minutes.seconds - HH.MM.SS.rar) และควรวางไว้ใน แค็ตตาล็อกใหม่ซึ่งชื่อจะต้องประกอบด้วยวันที่ปัจจุบัน (วัน.เดือน.ปี - วว.ดด.ปปป) สำหรับการเก็บถาวรเราจะใช้ RAR archiver รูปแบบการเปิดตัวสำหรับการสร้างไฟล์เก็บถาวร:
RAR เอ-อาร์< путь и имя архива > < Путь и имя архивируемых данных >
ก- คำสั่งสร้างไฟล์เก็บถาวร
-ร- คีย์ที่กำหนดการเก็บถาวรไดเร็กทอรีย่อย (เนื่องจากมีไดเร็กทอรีย่อยในโฟลเดอร์ต้นทาง)
ดังนั้น ในการแก้ปัญหา คุณต้องสร้างชื่อและเส้นทางสำหรับ RAR อย่างถูกต้อง สำหรับสิ่งนี้เราจะใช้ปัจจัยต่อไปนี้:
วันที่ที่ได้รับจากตัวแปร %DATE% พร้อมการตั้งค่าภูมิภาคมาตรฐานจะมีลักษณะดังนี้: ตั้ง VDATE=%วันที่:~3% สร้างไดเร็กทอรีบนไดรฟ์ C: ซึ่งมีชื่อ = วันที่ปัจจุบันจากตัวแปร VDATE: MD C:\%VDATE% เวลาที่ได้รับจากตัวแปร %TIME%: มาเปิดตัว Archiver กัน: ตอนนี้คุณสามารถสร้างแบตช์ไฟล์ที่มีเนื้อหา: ตั้ง VDATE=%วันที่:~3% ไฟล์แบตช์ดังกล่าวสามารถดำเนินการผ่านการโหลดอัตโนมัติหรือเป็นส่วนหนึ่งของสคริปต์ เมื่อผู้ใช้เข้าสู่ระบบโดเมน หรือใช้เครื่องกำหนดเวลาในเวลาที่กำหนด และคุณจะมีที่เก็บข้อมูลสำคัญตามลำดับเวลาอยู่เสมอ
ไฟล์แบตช์นี้สร้างการเก็บถาวรเนื้อหาของโฟลเดอร์ "My Documents" ของผู้ใช้ Win2K/XP โดยวางไว้ในไดเร็กทอรี |
25-08-2013 14:35:35: บทความ: ความปลอดภัยของข้อมูล: ซอฟต์แวร์ คุณชอบมันไหม?
- ในบทความนี้:
- การกำหนดตัวแปร
- ตัวแปรบรรทัดคำสั่ง (พารามิเตอร์การเรียกไฟล์ค้างคาว)
- ถ้าตัวดำเนินการแบบมีเงื่อนไข
- การใช้ค่าส่งคืน (กำลังประมวลผลโค้ดออก)
การกำหนดตัวแปร
ชุด<Имяпеременной>=<Значениепеременной>
คำสั่ง 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 หรือโดยใช้คำสั่ง:
ในข้อความของไฟล์ bat นั้นเอง วิธีที่สองดูเหมือนจะสะดวกกว่าสำหรับฉัน - การกำหนดให้ใครสักคนเรียกใช้สคริปต์ของคุณด้วยพารามิเตอร์บางตัวนั้นไม่ใช่เรื่องดี
ด้วยเหตุนี้ ตัวอย่างที่ "ผิด" ก่อนหน้านี้สามารถแก้ไขได้ดังนี้:
ถ้า "%BUILDMODE%" == "debug" (
setlocal ที่เปิดใช้งานelayedexpansion
ตั้งค่า OPTFLAGS=/Od
Echo INFO: การตั้งค่าสภาพแวดล้อมโหมดแก้ไขข้อบกพร่อง
) อื่น (
ตั้งค่า CCFLAGS=!OPTFLAGS! /MDd /Z7
ตั้งค่า OPTFLAGS=/O2
Echo INFO: การตั้งค่าสภาพแวดล้อมโหมดรีลีส
ตั้งค่า CCFLAGS=!OPTFLAGS! /นพ
แต่ไม่ว่าในกรณีใด นี่ยังดีกว่าจำนวนแท็กและการเปลี่ยนภาพที่บ้าคลั่งมาก
ฟังก์ชั่น
เป็นไปได้ไหมที่จะสร้างฟังก์ชั่นในไฟล์ bat? ใช่คุณสามารถ ยิ่งกว่านั้นบางครั้งก็จำเป็นด้วยซ้ำ จริงอยู่สิ่งเหล่านี้สามารถเรียกได้ว่าเป็นฟังก์ชันแบบมีเงื่อนไข
มีไวยากรณ์พิเศษสำหรับคำสั่ง call ซึ่งช่วยให้คุณไปที่เครื่องหมายในไฟล์ bat เดียวกันโดยจดจำตำแหน่งที่เกิดการโทรนี้:
โทร: อาร์กิวเมนต์ป้ายกำกับ
ฟังก์ชั่นส่งคืนด้วยคำสั่ง:
exit /b [รหัสส่งคืนทางเลือก]
ที่นี่คีย์ /b มีความสำคัญมาก: หากไม่มีมัน คุณจะออกจากฟังก์ชันไม่ได้ แต่จะออกจากสคริปต์โดยทั่วไป
สำหรับรายละเอียด ให้พิมพ์ที่บรรทัดคำสั่ง:
เรียก/?
ออก /?
สิ่งที่น่าสนใจคือ คำสั่งการโทรที่มีไวยากรณ์นี้รองรับการโทรแบบเรียกซ้ำด้วยการสร้างเฟรมใหม่โดยอัตโนมัติสำหรับอาร์กิวเมนต์ตัวแปร %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
โปรดทราบว่าการวิเคราะห์รหัสทางออกไม่ได้เริ่มต้นจากศูนย์ แต่จากค่าสูงสุดที่เป็นไปได้ ความจริงก็คือการตรวจสอบดังกล่าวหมายถึง: “ถ้าระดับข้อผิดพลาดมากกว่าหรือเท่ากับค่าแล้ว...” นั่นคือถ้าเราตรวจสอบโดยเริ่มจากศูนย์ ค่าใดๆ ก็ตามในบรรทัดแรกจะเป็นจริงซึ่งไม่ถูกต้อง
นี่เป็นข้อผิดพลาดที่พบบ่อยที่สุดในโปรแกรมประเภทนี้
การประกาศตัวแปรของคุณเองเป็นส่วนสำคัญของภาษาการเขียนโปรแกรมเกือบทุกภาษา ดังนั้นในภาษา vbscript ตัวแปรจึงถูกประกาศโดยใช้คำสำคัญ สลัวและใน jscript จะใช้ คำหลัก var.
ตัวแปรคำสั่ง สตริงของ Windowsแสดงถึงอักขระที่แตกต่างกันเล็กน้อย ที่นี่คุณไม่สามารถประกาศกลุ่มของตัวแปร cmd หรือกำหนดค่าให้กับตัวแปรหลายตัวในบรรทัดคำสั่งได้ทันที เรามาดูกันดีกว่า บรรทัดถัดไปรหัส:
เสียงสะท้อน % Var3% เสียงสะท้อน % VAR3% เสียงสะท้อน % vAr3% |
จุดหนึ่งที่ควรพิจารณาคือการบันทึก
ตั้ง var1 = 100 |
ตั้งค่า var1 = 100 |
นี่ไม่ใช่สิ่งเดียวกันนั่นคือในกรณีแรกเราสร้างตัวแปร cmd "var1" และในกรณีที่สอง - "var1" สถานการณ์ก็คล้ายๆ กับการกำหนดค่า ดังนั้น ควรใส่ใจกับพื้นที่!!!
เราเห็นว่าเราสามารถแสดงค่าของตัวแปรโดยใช้ฟังก์ชันได้ เอคโค่เราใส่ไว้ในสัญลักษณ์ "%" สำหรับ ชุด– เราเพียงแค่เขียนชื่อของมัน มันก็คุ้มค่าที่จะพิจารณาว่าตัวแปรทั้งหมดถูกกำหนดประเภทสตริง
ถ้าคุณวิ่ง คำสั่ง cmd set ซึ่งแสดงรายการตัวแปรทั้งหมดและค่าของมัน เซสชันปัจจุบันคุณจะเห็นว่าตัวแปร cmd ที่สร้างขึ้นใหม่และ. เราจะสามารถเข้าถึงสิ่งเหล่านี้ได้ตลอดเซสชั่นทั้งหมด
หากต้องการล้างเนื้อหาในบรรทัดคำสั่งของ Windows คุณเพียงแค่ต้องกำหนดค่าว่าง:
จะพิมพ์บรรทัด %Var3% และคำสั่ง
ในตัวอย่างนี้ เราเลี่ยงอักขระ & และ ^ ดังนั้นจึงกำหนดวลี:
"100 & 3 = 5"
"100 ^3"
เป็นที่น่าสังเกตว่าหากเราพยายามแสดงค่าของตัวแปรเหล่านี้โดยใช้ ฟังก์ชัน cmdตั้งค่าไว้ก็จะไม่มีปัญหา แต่ถ้าเราใช้ฟังก์ชัน echo เราก็จะได้ผลลัพธ์ที่แตกต่างไปจากที่เราคาดไว้อย่างสิ้นเชิง ดังนั้น เมื่อคุณพยายามรันคำสั่งต่อไปนี้:
ตอนนี้เมื่อรันโค้ด:
เสียงสะท้อน %var4% เสียงก้อง %var5% |
ทุกอย่างจะเป็นไปด้วยดี
เป็นที่ชัดเจนว่าตัวแปร cmd ที่สร้างขึ้นในหน้าต่างบรรทัดคำสั่งปัจจุบันไม่พร้อมใช้งานสำหรับกระบวนการอื่น ๆ แต่สามารถตั้งค่าข้อจำกัดที่ยิ่งใหญ่กว่าได้
จะถามอะไร พื้นที่ท้องถิ่นการมองเห็นมีการใช้บล็อก SETLOCAL...ENDLOCAL- ตัวแปร cmd บรรทัดคำสั่งของ Windows ทั้งหมดที่ประกาศไว้ตรงกลางบล็อกนี้จะไม่สามารถมองเห็นได้ภายนอกบล็อก เปิดตัวแก้ไข (ฉันใช้โปรแกรมแก้ไข กระดาษจดบันทึก++เนื่องจากจะไฮไลท์โค้ดทันที) และเขียนโค้ดบรรทัดต่อไปนี้ลงไป:
เราจะเห็นว่าอันดับแรกเราประกาศ var1 และกำหนดค่าให้เป็น 0 จากนั้นเราประกาศตัวแปรที่มีชื่อเดียวกันอีกครั้ง แต่อยู่ในบล็อก SETLOCAL...ENDLOCAL- สคริปต์ส่งออกค่าของ var1 ทั้งภายในและส่วนกลาง ฉันใช้ตัวอักษรละตินโดยเฉพาะเพื่อที่ว่าถ้าเกิดอะไรขึ้นคุณจะไม่โดนต้มตุ๋น