Có hai lệnh có sẵn cho lời nhắc người dùng trên dòng lệnh của windows:
- thiết lập với tùy chọn
/P
có sẵn trên tất cả các phiên bản Windows NT với phần mở rộng lệnh được bật và
- choice.exe có sẵn theo mặc định trên Windows Vista và các phiên bản Windows mới hơn cho người dùng PC và trên Windows Server 2003 và các phiên bản máy chủ mới hơn của Windows.
set là một lệnh nội bộ của bộ xử lý lệnh Windows cmd.exe
. Tùy chọn /P
nhắc người dùng về một chuỗi chỉ khả dụng với các phần mở rộng lệnh đã bật được bật theo mặc định vì ngày nay gần như không có tệp hàng loạt nào hoạt động nữa.
choice.exe là một ứng dụng bảng điều khiển riêng biệt (lệnh bên ngoài) nằm trong %SystemRoot%\System32
. choice.exe
của Windows Server 2003 có thể được sao chép vào thư mục %SystemRoot%\System32
trên máy Windows XP để sử dụng trên Windows XP giống như nhiều lệnh khác không có sẵn theo mặc định trên Windows XP, nhưng có sẵn theo mặc định trên Windows Server 2003.
Cách tốt nhất là ưu tiên sử dụng CHOICE hơn sử dụng SET / P vì những lý do sau:
- CHOICE chỉ chấp nhận các phím (tương ứng các ký tự được đọc từ STDIN ) được chỉ định sau tùy chọn
/C
(và Ctrl+C) và phát ra tiếng bíp lỗi nếu người dùng nhấn nhầm phím.
- CHOICE không yêu cầu nhấn bất kỳ phím nào khác ngoài một trong những phím được chấp nhận. CHOICE thoát ngay lập tức sau khi nhấn một phím chấp nhận được trong khi SET / P yêu cầu người dùng kết thúc nhập bằng RETURNhoặc ENTER.
- Với CHOICE, có thể xác định tùy chọn mặc định và thời gian chờ để tự động tiếp tục với tùy chọn mặc định sau vài giây mà không cần chờ người dùng.
- Kết quả tốt hơn khi trả lời lời nhắc tự động từ một tệp lô khác gọi tệp lô với lời nhắc bằng cách sử dụng điều gì đó giống như
echo Y | call PromptExample.bat
trên sử dụng CHOICE .
- Việc đánh giá lựa chọn của người dùng dễ dàng hơn nhiều với CHOICE vì CHOICE thoát ra với giá trị theo phím được nhấn (ký tự) được gán cho ERRORLEVEL có thể dễ dàng đánh giá tiếp theo.
- Biến môi trường được sử dụng trên SET / P không được xác định nếu người dùng chỉ nhấn phím RETURNhoặc ENTERvà nó không được xác định trước khi nhắc người dùng. Biến môi trường được sử dụng trên dòng lệnh SET / P giữ giá trị hiện tại của nó nếu được xác định trước và người dùng nhấn chỉ RETURNhoặc ENTER.
- Người dùng có quyền tự do nhập bất kỳ thứ gì khi được nhắc với SET / P bao gồm một chuỗi dẫn đến việc thoát khỏi thực thi tệp hàng loạt sau đó
cmd
do lỗi cú pháp hoặc khi thực hiện các lệnh không được bao gồm trong tệp hàng loạt trên không tệp hàng loạt được mã hóa tốt. Nó cần một số nỗ lực để có được SET / P an toàn trước sự nhập nhầm hoặc cố ý của người dùng.
Đây là một ví dụ nhanh chóng sử dụng CHỌN ưa thích và cách khác là SET / P trên choice.exe
không khả dụng trên máy tính đã qua sử dụng chạy 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 ...
Lưu ý: Tệp lô này sử dụng phần mở rộng lệnh không có sẵn trên Windows 95/98 / ME bằng cách sử dụng command.com
thay vì cmd.exe
làm trình thông dịch lệnh.
Dòng lệnh set "UserChoice=!UserChoice: =!"
được thêm vào để có thể gọi tệp hàng loạt này với echo Y | call PromptExample.bat
trên Windows NT4 / 2000 / XP và không yêu cầu sử dụng echo Y| call PromptExample.bat
. Nó xóa tất cả các khoảng trắng khỏi chuỗi được đọc từ STDIN trước khi chạy so sánh hai chuỗi.
echo Y | call PromptExample.bat
kết quả là YSPACE được gán cho biến môi trường UserChoice
. Điều đó sẽ dẫn đến việc xử lý lời nhắc hai lần vì "Y "
không phân biệt chữ hoa chữ thường "N"
và "Y"
không xóa tất cả các khoảng trắng đầu tiên. Vì vậy, UserChoice
với YSPACE as value sẽ dẫn đến việc chạy lời nhắc lần thứ hai với tùy chọn N
được xác định là mặc định trong tệp lô khi thực hiện lời nhắc thứ hai, điều này tiếp theo dẫn đến việc thoát xử lý tệp hàng loạt không mong muốn. Vâng, việc sử dụng SET / P một cách an toàn thực sự phức tạp, phải không?
Để biết thêm chi tiết về cách sử dụng SET / P và CHOICE để nhắc người dùng lựa chọn từ danh sách các tùy chọn, hãy xem câu trả lời về Cách ngăn trình thông dịch lệnh của Windows thoát thực thi tệp hàng loạt trên đầu vào không chính xác của người dùng?
Một số gợi ý khác:
- IF so sánh hai chuỗi bên trái và bên phải của toán tử so sánh với bao gồm cả dấu ngoặc kép. Vì vậy, so sánh không phân biệt chữ hoa chữ thường không phải là giá trị của
UserChoice
với N
và Y
, mà là giá trị của được UserChoice
bao quanh bởi "
với "N"
và "Y"
.
- Các NẾU toán tử so sánh
EQU
và NEQ
được thiết kế chủ yếu để so sánh hai số nguyên trong phạm vi -2147483648 đến 2147483647 và không để so sánh hai chuỗi. EQU
và NEQ
cũng hoạt động đối với so sánh chuỗi, nhưng dẫn đến việc so sánh các chuỗi trong dấu ngoặc kép do một nỗ lực vô ích để chuyển đổi chuỗi bên trái thành số nguyên. EQU
và chỉ NEQ
có thể được sử dụng với các phần mở rộng lệnh được kích hoạt. Các toán tử so sánh để so sánh chuỗi ==
và not ... ==
hoạt động ngay cả với các phần mở rộng lệnh bị vô hiệu hóa vì ngay cả command.com
MS-DOS và Windows 95/98 / ME đã hỗ trợ chúng. Để biết thêm chi tiết về toán tử so sánh IF, hãy xem Biểu tượng tương đương với NEQ, LSS, GTR, v.v. trong tệp hàng loạt của Windows .
- Lệnh
goto :EOF
yêu cầu các phần mở rộng lệnh được bật để thực sự thoát khỏi quá trình xử lý tệp hàng loạt. Để biết thêm chi tiết, hãy xem GOTO: EOF quay trở lại đâu?
Để hiểu các lệnh đã sử dụng và cách chúng hoạt động, hãy mở cửa sổ nhắc lệnh, thực hiện ở đó các lệnh sau và đọc rất kỹ tất cả các trang trợ giúp được hiển thị cho từng lệnh.
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
Xem thêm:
SET AREYOUSURE=N
trước lời nhắc để xóa lựa chọn nếu bạn đã chạy tập lệnh trước đó trong cửa sổ lệnh đó. Nếu không có nó, mặc định sẽ vẫn là lựa chọn đã chọn trước đó.