มีคำสั่งสองคำสั่งสำหรับคำสั่งของผู้ใช้ในบรรทัดคำสั่งของ windows:
- ตั้งค่าด้วยตัวเลือกที่
/P
มีอยู่ใน Windows NT ทุกรุ่นที่มีส่วนขยายคำสั่งที่เปิดใช้งานและ
- choice.exeพร้อมใช้งานตามค่าเริ่มต้นใน Windows Vista และ Windows รุ่นที่ใหม่กว่าสำหรับผู้ใช้พีซีและบน Windows Server 2003 และ Windows เวอร์ชันเซิร์ฟเวอร์ที่ใหม่กว่า
ชุดcmd.exe
เป็นคำสั่งภายในของหน่วยประมวลผลคำสั่งของ Windows ตัวเลือก/P
ในการแจ้งผู้ใช้สำหรับสตริงจะใช้ได้เฉพาะกับส่วนขยายคำสั่งที่เปิดใช้งานซึ่งเปิดใช้งานโดยค่าเริ่มต้นเนื่องจากในปัจจุบันแทบจะไม่มีไฟล์แบตช์ใด ๆ
choice.exeเป็นแอปพลิเคชันคอนโซลแยกต่างหาก (คำสั่งภายนอก) ที่อยู่ใน%SystemRoot%\System32
. choice.exe
ของ Windows Server 2003 สามารถคัดลอกไปยังไดเร็กทอรี%SystemRoot%\System32
บนเครื่อง Windows XP สำหรับการใช้งานบน Windows XP เช่นเดียวกับคำสั่งอื่น ๆ ที่ไม่มีให้โดยค่าเริ่มต้นใน Windows XP แต่จะพร้อมใช้งานตามค่าเริ่มต้นใน Windows Server 2003
แนวทางปฏิบัติที่ดีที่สุดคือชอบใช้CHOICEมากกว่าการใช้SET / Pเนื่องจากเหตุผลดังต่อไปนี้:
- CHOICEยอมรับเฉพาะคีย์ (อักขระตามลำดับที่อ่านจากSTDIN ) ที่ระบุหลังตัวเลือก
/C
(และCtrl+C) และส่งสัญญาณเตือนข้อผิดพลาดหากผู้ใช้กดปุ่มผิด
- CHOICEไม่จำเป็นต้องกดปุ่มอื่นใดนอกจากปุ่มใดปุ่มหนึ่งที่ยอมรับได้ CHOICEออกทันทีที่ได้รับการยอมรับคีย์ถูกกดในขณะที่SET / Pต้องการให้ผู้ใช้เสร็จสิ้นการป้อนข้อมูลด้วยหรือRETURNENTER
- เป็นไปได้ด้วยCHOICEเพื่อกำหนดตัวเลือกเริ่มต้นและการหมดเวลาเพื่อดำเนินการต่อโดยอัตโนมัติโดยใช้ตัวเลือกเริ่มต้นหลังจากผ่านไปสักครู่โดยไม่ต้องรอให้ผู้ใช้
- การส่งออกจะดีกว่าการตอบพรอมต์โดยอัตโนมัติจากไฟล์ชุดอื่นซึ่งเรียกไฟล์ชุดที่มีการใช้สิ่งที่พรอมต์เช่น
echo Y | call PromptExample.bat
เกี่ยวกับการใช้CHOICE
- การประเมินตัวเลือกของผู้ใช้นั้นง่ายกว่ามากด้วยCHOICEเนื่องจากการออกจากCHOICEด้วยค่าตามคีย์ที่กด (อักขระ) ซึ่งกำหนดให้กับERRORLEVELซึ่งสามารถประเมินต่อไปได้อย่างง่ายดาย
- ตัวแปรสภาพแวดล้อมที่ใช้ในSET / Pไม่ได้กำหนดไว้หากผู้ใช้กดเพียงแค่คีย์RETURNหรือENTERและไม่ได้กำหนดไว้ก่อนที่จะแจ้งผู้ใช้ ตัวแปรสภาพแวดล้อมที่ใช้ในSET / Pบรรทัดคำสั่งช่วยให้มูลค่าปัจจุบันถ้ากำหนดไว้ก่อนและผู้ใช้กดเพียงหรือRETURNENTER
- ผู้ใช้มีอิสระในการป้อนข้อมูลใด ๆ เมื่อได้รับแจ้งด้วยSET / Pรวมถึงสตริงซึ่งส่งผลให้ในภายหลังออกจากการเรียกใช้ไฟล์แบตช์
cmd
เนื่องจากข้อผิดพลาดทางไวยากรณ์หรือในการดำเนินการคำสั่งที่ไม่รวมอยู่ในไฟล์แบตช์ ไฟล์แบตช์รหัสที่ดี ต้องใช้ความพยายามบางอย่างเพื่อให้SET / Pปลอดภัยโดยไม่ได้ตั้งใจหรือป้อนข้อมูลผู้ใช้ผิดโดยเจตนา
นี่คือตัวอย่างที่รวดเร็วโดยใช้CHOICEที่ต้องการและอีกทางเลือกหนึ่งคือSET / Pบนchoice.exe
คอมพิวเตอร์ที่ใช้ Windows ไม่ได้
@echo off
echo This is an example for prompting a user.
echo/
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice
setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice=N"
set /P "UserChoice=Are you sure [Y/N]? "
set "UserChoice=!UserChoice: =!"
if /I "!UserChoice!" == "N" endlocal & goto :EOF
if /I not "!UserChoice!" == "Y" goto UseSetPrompt
endlocal
goto Continue
:UseChoice
%SystemRoot%\System32\choice.exe /C YN /N /M "Are you sure [Y/N]? "
if errorlevel 2 goto :EOF
:Continue
echo So your are sure. Okay, let's go ...
หมายเหตุ:ไฟล์แบตช์นี้ใช้นามสกุลคำสั่งซึ่งไม่มีใน Windows 95/98 / ME โดยใช้command.com
แทนตัวcmd.exe
แปลคำสั่ง
set "UserChoice=!UserChoice: =!"
มีการเพิ่มบรรทัดคำสั่งเพื่อให้สามารถเรียกไฟล์แบตช์นี้ด้วยecho Y | call PromptExample.bat
บน Windows NT4 / 2000 / XP และไม่ต้องการการใช้งานecho Y| call PromptExample.bat
ไฟล์. จะลบช่องว่างทั้งหมดจากสตริงที่อ่านจากSTDINก่อนที่จะรันการเปรียบเทียบสองสตริง
echo Y | call PromptExample.bat
ผลลัพธ์ในYได้รับมอบหมายให้ตัวแปรสภาพแวดล้อมSPACE UserChoice
นั่นจะส่งผลให้ประมวลผลพรอมต์สองครั้งเนื่องจาก"Y "
ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่เท่ากัน"N"
หรือ"Y"
ไม่ลบช่องว่างทั้งหมดก่อน ดังนั้นUserChoice
ด้วยYSPACEเป็นค่าจะส่งผลให้เรียกใช้พรอมต์เป็นครั้งที่สองโดยมีตัวเลือกN
ตามที่กำหนดไว้เป็นค่าเริ่มต้นในไฟล์แบตช์ในการดำเนินการพร้อมต์ครั้งที่สองซึ่งส่งผลให้การประมวลผลไฟล์แบตช์ออกโดยไม่คาดคิด ใช่การใช้งานSET / P อย่างปลอดภัยนั้นยุ่งยากจริงๆใช่หรือไม่?
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการใช้งานSET / PและCHOICEสำหรับการแจ้งให้ผู้ใช้เลือกจากรายการตัวเลือกโปรดดูคำตอบเกี่ยวกับวิธีหยุดตัวแปลคำสั่งของ Windows จากการออกจากการเรียกใช้ไฟล์แบตช์ในข้อมูลที่ผู้ใช้ป้อนไม่ถูกต้อง
คำแนะนำเพิ่มเติม:
- IFเปรียบเทียบสองสตริงทางซ้ายและขวาของตัวดำเนินการเปรียบเทียบกับการรวมเครื่องหมายคำพูดคู่ ดังนั้นกรณีตายเมื่อเทียบไม่ได้ค่าของ
UserChoice
ด้วยN
และY
แต่ค่าของUserChoice
รายล้อมไปด้วย"
ด้วยและ"N"
"Y"
- ตัวดำเนินการเปรียบเทียบIF
EQU
และNEQ
ได้รับการออกแบบหลักสำหรับการเปรียบเทียบจำนวนเต็มสองจำนวนในช่วง -2147483648 ถึง 2147483647 และไม่ใช่สำหรับการเปรียบเทียบสองสตริง EQU
และNEQ
ยังใช้สำหรับการเปรียบเทียบสตริง แต่ผลจากการเปรียบเทียบสตริงในเครื่องหมายคำพูดคู่กับความพยายามที่ไร้ประโยชน์ในการแปลงสตริงทางซ้ายเป็นจำนวนเต็ม EQU
และNEQ
สามารถใช้ได้เฉพาะกับส่วนขยายคำสั่งที่เปิดใช้งาน ตัวดำเนินการเปรียบเทียบสำหรับการเปรียบเทียบสตริงคือ==
และใช้not ... ==
งานได้แม้กับส่วนขยายคำสั่งที่ปิดใช้งานเนื่องจากcommand.com
MS-DOS และ Windows 95/98 / ME รองรับแล้ว สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหากดำเนินการเปรียบเทียบดูสัญลักษณ์เทียบเท่ากับ NEQ, LSS, GTR ฯลฯ ในไฟล์ชุดของ
- คำสั่ง
goto :EOF
ต้องการส่วนขยายคำสั่งที่เปิดใช้งานเพื่อออกจากการประมวลผลไฟล์แบตช์จริงๆ ดูรายละเอียดเพิ่มเติมได้ที่ GOTO: EOF จะกลับไปที่ใด
เพื่อความเข้าใจคำสั่งที่ใช้และวิธีการทำงานให้เปิดหน้าต่างพรอมต์คำสั่งดำเนินการคำสั่งต่อไปนี้และอ่านหน้าวิธีใช้ทั้งหมดที่แสดงสำหรับแต่ละคำสั่งอย่างระมัดระวัง
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
ดูสิ่งนี้ด้วย:
SET AREYOUSURE=N
ก่อนพรอมต์เพื่อล้างตัวเลือกหากคุณเคยรันสคริปต์มาก่อนในหน้าต่างคำสั่งนั้น หากไม่มีค่าเริ่มต้นจะยังคงเป็นตัวเลือกที่เลือกไว้ก่อนหน้านี้