Làm cách nào để tạo lời nhắc “bạn có chắc chắn” trong tệp lô hàng Windows không?


94

Tôi có một tệp hàng loạt tự động sao chép một loạt tệp từ nơi này sang nơi khác và trở lại cho tôi. Chỉ có điều là nó giúp tôi rất nhiều, tôi cứ vô tình chọn lệnh đó khỏi bộ đệm lệnh của mình và ghi đè hàng loạt các thay đổi không giới hạn.

Tôi sẽ cần mã nào cho tệp .bat của mình để làm cho nó nói "bạn có chắc không" và yêu cầu tôi nhập "y" trước khi nó chạy phần còn lại của tệp? Nếu bất cứ điều gì ngoại trừ "y" được nhập, nó sẽ thoát khỏi thực thi trên dòng đó.

Chỉnh sửa Ngày 27 tháng 11 Được rồi, tôi đã đánh dấu lại câu trả lời này là chưa trả lời vì tôi vẫn chưa thể tìm ra. Khi tôi gọi "thoát ra;" nó đóng cmd.exe mà không phải là những gì tôi muốn. Tất cả điều này là do Windows triển khai bộ đệm lệnh sai [khác với những gì tôi đã quen với ít nhất]

Câu trả lời:


168

Bạn muốn một cái gì đó như:

@echo off
setlocal
:PROMPT
SET /P AREYOUSURE=Are you sure (Y/[N])?
IF /I "%AREYOUSURE%" NEQ "Y" GOTO END

echo ... rest of file ...


:END
endlocal

5
Điều duy nhất tôi sẽ thêm là một bổ sung SET AREYOUSURE=Ntrướ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 đó.
isapir

4
@Igal Tôi khá chắc rằng cái setlocalvà cái endlocalnên quan tâm đến điều đó. %AREYOUSURE%sẽ không tồn tại nữa sau endlocal.

1
@dudeprgm bạn có lẽ đúng. Tôi nghĩ rằng tôi đã bỏ lỡ những thứ đó trong mã của mình.
isapir

2
... sẽ có giá trị hơn với một số từ giải thích về hai dòng quan trọng .
Wolf

@Joe Có lẽ anh ấy không thể vì (giống như tôi) anh ấy chưa (chưa) hiểu họ. Vì vậy, nếu bạn làm thế, nó sẽ là tuyệt vời nếu bạn có thể mở rộng về câu trả lời hoặc liên kết của bạn với các nguồn lực giải thích nó :)
Marcus Mangelsdorf


15

Các choicelệnh không có sẵn ở khắp mọi nơi. Với các phiên bản Windows mới hơn, setlệnh có /ptùy chọn mà bạn có thể nhận được thông tin đầu vào của người dùng

SET /P variable=[promptString]

xem set /?để biết thêm thông tin


... sâu sắc hơn nhiều so với cái được chấp nhận, nhưng rõ ràng chúng ta đang sống trong những thời điểm cấp bách.
Wolf

10

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 /Pcó 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
  • 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 /Pnhắ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.execủa Windows Server 2003 có thể được sao chép vào thư mục %SystemRoot%\System32trê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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.battrên sử dụng CHOICE .
  5. Việc đánh giá lựa chọn của người dùng dễ dàng hơn nhiều với CHOICECHOICE 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.
  6. 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.
  7. 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 đó cmddo 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.exekhô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.comthay vì cmd.exelà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.battrê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.batkế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""Y"không xóa tất cả các khoảng trắng đầu tiên. Vì vậy, UserChoicevớ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 / PCHOICE để 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:

  1. 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 UserChoicevới NY, mà là giá trị của được UserChoicebao quanh bởi "với "N""Y".
  2. Các NẾU toán tử so sánh EQUNEQđượ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. EQUNEQcũ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. EQUvà chỉ NEQcó 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 ==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.comMS-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 .
  3. Lệnh goto :EOFyê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:


1
Đây là một câu trả lời đáng kinh ngạc. Tôi chỉ sử dụng Choice.exe từ bây giờ.
Bas

choice.exe cũng có mặt trong DOS kể từ 6.0
Brian Minton

@BrianMinton Điều đó không đúng. Đã có sẵn ứng dụng 16-bit CHOICE.COMtheo mặc định trên MS-DOS 6.0, MS-DOS 7.0, Windows 95 và Windows 98. Nhưng không có ứng dụng nào choice.exeđược cài đặt theo mặc định trên Windows NT4, Windows 2000 và Windows XP. CHOICE.COMcũng có thể được sử dụng trên NT4, Windows 2000 và Windows XP, nhưng sẽ tốt hơn nếu sử dụng 32-bit choice.exetừ bộ tài nguyên thích hợp. Xem trang của Rob van der Woude về LỰA CHỌN . Các tùy chọn có một phần khác nhau giữa CHOICE.COMchoice.exe. Tuy nhiên, câu hỏi không phải là về DOS.
Mofi

5

Ở đây dễ dàng hơn một chút:

@echo off
set /p var=Are You Sure?[Y/N]: 
if %var%== Y goto ...
if not %var%== Y exit

hoặc là

@echo off
echo Are You Sure?[Y/N]
choice /c YN
if %errorlevel%==1 goto yes
if %errorlevel%==2 goto no
:yes
echo yes
goto :EOF
:no
echo no

sau khi Y đặt lệnh bạn muốn xảy ra. Đó là những gì ... dành cho :)
Bob Smith

Ý tôi là: %errorlevel%luôn là một giá trị số nguyên. Xem ở đây để biết tài liệu bao gồm một ví dụ.
Stephan

1

Đây là phương pháp bắt đầu của tôi cho câu trả lời có / không .

Nó cũng không phân biệt chữ hoa chữ thường.

Điều này chỉ kiểm tra các lỗi được cung cấp bởi đầu vào và đặt choicebiến thành bất kỳ thứ gì bạn yêu cầu để nó có thể được sử dụng bên dưới trong mã.

@echo off
choice /M "[Opt 1]  Do you want to continue [Yes/No]"
if errorlevel 255 (
  echo Error
  ) else if errorlevel 2 (
  set "YourChoice=will not"
  ) else if errorlevel 1 (
  set "YourChoice=will"
  ) else if errorlevel 0 (
  goto :EOF
  )
  echo %YourChoice%
  pause

0

Nếu bạn muốn chương trình hàng loạt thoát trở lại lời nhắc và không đóng lời nhắc (AKA cmd.exe), bạn có thể sử dụng "exit / b".

Điều này có thể hữu ích.

set /p _sure="Are you sure?"
::The underscore is used to ensure that "sure" is not an enviroment
::varible
if /I NOT "_sure"=="y" (
::the /I makes it so you can
exit /b
) else (
::Any other modifications...
)

Hoặc nếu bạn không muốn sử dụng nhiều dòng ...

Set /p _sure="Are you sure?"
if /I NOT "_sure"=="y" exit /b
::Any other modifications and commands.

Hi vọng điêu nay co ich...


0

Đây là một ví dụ đơn giản mà tôi sử dụng trong tập lệnh sao lưu (.bat / batch) trên Windows 10, cho phép tôi có các tùy chọn khác nhau khi sao lưu.

...

:choice
set /P c=Do you want to rsync the archives to someHost[Y/N]?
if /I "%c%" EQU "Y" goto :syncthefiles
if /I "%c%" EQU "N" goto :doonotsyncthefiles
goto :choice

:syncthefiles
echo rsync files to somewhere ...
bash -c "rsync -vaz /mnt/d/Archive/Backup/ user@host:/home/user/Backup/blabla/"
echo done

:doonotsyncthefiles
echo Backup Complete!

...

Bạn có thể có bao nhiêu khối tùy ý.


0

Đầu tiên, mở thiết bị đầu cuối.

Sau đó, gõ

cd ~
touch .sure
chmod 700 .sure

Tiếp theo, mở .sure và dán nó vào bên trong.

#!/bin/bash --init-file
PS1='> '
alias y='
    $1
    exit
'
alias n='Taskkill /IM %Terminal% /f'
echo ''
echo 'Are you sure? Answer y or n.'
echo ''

Sau đó, đóng tệp.

~/.sure ; ENTER COMMAND HERE

Điều này sẽ cung cấp cho bạn lời nhắc bạn có chắc chắn không trước khi tiếp tục lệnh.


Có thể trong bash, nhưng chắc chắn không theo lô.
Stephan

Oh. Tôi đoán là không. Nó chỉ hoạt động cho các lệnh đầu cuối không phải lệnh hàng loạt. Xin lỗi vì thông tin sai
user13636521

-1

Mở thiết bị đầu cuối. Nhập nội dung sau

echo>sure.sh
chmod 700 sure.sh

Dán cái này vào bên trong sure.sh

#!\bin\bash

echo -n 'Are you sure? [Y/n] '
read yn

if [ "$yn" = "n" ]; then
    exit 1
fi

exit 0

Đóng sure.sh và nhập điều này vào thiết bị đầu cuối.

alias sure='~/sure&&'

Bây giờ, nếu bạn gõ chắc chắn trước khi nhập lệnh, nó sẽ cung cấp cho bạn lời nhắc bạn có chắc chắn không trước khi tiếp tục lệnh.

Hy vọng điều này là hữu ích!


Có thể trong bash, nhưng chắc chắn không theo lô.
Stephan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.