ฉันจะสร้างพร้อมต์“ คุณแน่ใจ” ใน Windows batchfile ได้อย่างไร


95

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

ฉันต้องใช้รหัสอะไรสำหรับไฟล์. bat เพื่อให้มันบอกว่า "คุณแน่ใจ" และทำให้ฉันพิมพ์ "y" ก่อนที่จะเรียกใช้ไฟล์ที่เหลือ หากมีการพิมพ์อะไรก็ตามยกเว้น "y" ควรออกจากการดำเนินการในบรรทัดนั้น

แก้ไข 27 พ.ย. โอเคฉันทำเครื่องหมายว่ายังไม่ได้รับคำตอบอีกครั้งเพราะฉันยังคิดไม่ออก เมื่อฉันเรียก "exit;" มันปิด cmd.exe ซึ่งไม่ใช่สิ่งที่ฉันต้องการ ทั้งหมดนี้เป็นเพราะ Windows ใช้บัฟเฟอร์คำสั่งผิด [แตกต่างจากที่ฉันคุ้นเคยอย่างน้อยที่สุด]

คำตอบ:


169

คุณต้องการสิ่งที่ชอบ:

@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
สิ่งเดียวที่ฉันจะเพิ่มคือส่วนเพิ่มเติมSET AREYOUSURE=Nก่อนพรอมต์เพื่อล้างตัวเลือกหากคุณเคยรันสคริปต์มาก่อนในหน้าต่างคำสั่งนั้น หากไม่มีค่าเริ่มต้นจะยังคงเป็นตัวเลือกที่เลือกไว้ก่อนหน้านี้
isapir

4
@ อิกัลฉันค่อนข้างมั่นใจว่าsetlocalและendlocalควรดูแลสิ่งนั้น %AREYOUSURE%จะไม่มีอยู่อีกต่อไปหลังจากendlocal.

1
@dudeprgm คุณอาจจะใช่ ฉันคิดว่าฉันพลาดสิ่งที่อยู่ในรหัสของฉัน
isapir

2
... จะมีค่ามากขึ้นเมื่อมีคำอธิบายเกี่ยวกับสองบรรทัดที่สำคัญ
Wolf

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

34

ลองใช้คำสั่ง CHOICEเช่น

CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."

8
<อวด> แม้ว่านี่จะค่อนข้างใหม่ มันถูกเพิ่มใน MS-DOS 6 ในปี 1993 หรือ 1994 ดังนั้นจึงอาจใช้ไม่ได้กับการใช้งานทั้งหมด </ show off>
Nathan Fellman

7
ตัวอย่างวิธีการใช้งาน choice ที่นี่computerhope.com/issues/ch001674.htm
Matthew Lock

ทำงานได้อย่างสมบูรณ์บน Windows 10 cmd
Braulio J. Solano

16

choiceคำสั่งไม่สามารถใช้ได้ทุกที่ ด้วย Windows เวอร์ชันใหม่setคำสั่งมี/pตัวเลือกที่คุณสามารถรับอินพุตของผู้ใช้ได้

SET /P variable=[promptString]

ดูset /?ข้อมูลเพิ่มเติม


... มีความเข้าใจลึกซึ้งมากกว่าที่ยอมรับ แต่เห็นได้ชัดว่าเราอยู่ในช่วงเวลาเร่งด่วน
Wolf

12

มีคำสั่งสองคำสั่งสำหรับคำสั่งของผู้ใช้ในบรรทัดคำสั่งของ 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เนื่องจากเหตุผลดังต่อไปนี้:

  1. CHOICEยอมรับเฉพาะคีย์ (อักขระตามลำดับที่อ่านจากSTDIN ) ที่ระบุหลังตัวเลือก/C(และCtrl+C) และส่งสัญญาณเตือนข้อผิดพลาดหากผู้ใช้กดปุ่มผิด
  2. CHOICEไม่จำเป็นต้องกดปุ่มอื่นใดนอกจากปุ่มใดปุ่มหนึ่งที่ยอมรับได้ CHOICEออกทันทีที่ได้รับการยอมรับคีย์ถูกกดในขณะที่SET / Pต้องการให้ผู้ใช้เสร็จสิ้นการป้อนข้อมูลด้วยหรือRETURNENTER
  3. เป็นไปได้ด้วยCHOICEเพื่อกำหนดตัวเลือกเริ่มต้นและการหมดเวลาเพื่อดำเนินการต่อโดยอัตโนมัติโดยใช้ตัวเลือกเริ่มต้นหลังจากผ่านไปสักครู่โดยไม่ต้องรอให้ผู้ใช้
  4. การส่งออกจะดีกว่าการตอบพรอมต์โดยอัตโนมัติจากไฟล์ชุดอื่นซึ่งเรียกไฟล์ชุดที่มีการใช้สิ่งที่พรอมต์เช่นecho Y | call PromptExample.batเกี่ยวกับการใช้CHOICE
  5. การประเมินตัวเลือกของผู้ใช้นั้นง่ายกว่ามากด้วยCHOICEเนื่องจากการออกจากCHOICEด้วยค่าตามคีย์ที่กด (อักขระ) ซึ่งกำหนดให้กับERRORLEVELซึ่งสามารถประเมินต่อไปได้อย่างง่ายดาย
  6. ตัวแปรสภาพแวดล้อมที่ใช้ในSET / Pไม่ได้กำหนดไว้หากผู้ใช้กดเพียงแค่คีย์RETURNหรือENTERและไม่ได้กำหนดไว้ก่อนที่จะแจ้งผู้ใช้ ตัวแปรสภาพแวดล้อมที่ใช้ในSET / Pบรรทัดคำสั่งช่วยให้มูลค่าปัจจุบันถ้ากำหนดไว้ก่อนและผู้ใช้กดเพียงหรือRETURNENTER
  7. ผู้ใช้มีอิสระในการป้อนข้อมูลใด ๆ เมื่อได้รับแจ้งด้วย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 จากการออกจากการเรียกใช้ไฟล์แบตช์ในข้อมูลที่ผู้ใช้ป้อนไม่ถูกต้อง

คำแนะนำเพิ่มเติม:

  1. IFเปรียบเทียบสองสตริงทางซ้ายและขวาของตัวดำเนินการเปรียบเทียบกับการรวมเครื่องหมายคำพูดคู่ ดังนั้นกรณีตายเมื่อเทียบไม่ได้ค่าของUserChoiceด้วยNและYแต่ค่าของUserChoiceรายล้อมไปด้วย"ด้วยและ"N""Y"
  2. ตัวดำเนินการเปรียบเทียบIFEQUและNEQได้รับการออกแบบหลักสำหรับการเปรียบเทียบจำนวนเต็มสองจำนวนในช่วง -2147483648 ถึง 2147483647 และไม่ใช่สำหรับการเปรียบเทียบสองสตริง EQUและNEQยังใช้สำหรับการเปรียบเทียบสตริง แต่ผลจากการเปรียบเทียบสตริงในเครื่องหมายคำพูดคู่กับความพยายามที่ไร้ประโยชน์ในการแปลงสตริงทางซ้ายเป็นจำนวนเต็ม EQUและNEQสามารถใช้ได้เฉพาะกับส่วนขยายคำสั่งที่เปิดใช้งาน ตัวดำเนินการเปรียบเทียบสำหรับการเปรียบเทียบสตริงคือ==และใช้not ... ==งานได้แม้กับส่วนขยายคำสั่งที่ปิดใช้งานเนื่องจากcommand.comMS-DOS และ Windows 95/98 / ME รองรับแล้ว สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหากดำเนินการเปรียบเทียบดูสัญลักษณ์เทียบเท่ากับ NEQ, LSS, GTR ฯลฯ ในไฟล์ชุดของ
  3. คำสั่งgoto :EOFต้องการส่วนขยายคำสั่งที่เปิดใช้งานเพื่อออกจากการประมวลผลไฟล์แบตช์จริงๆ ดูรายละเอียดเพิ่มเติมได้ที่ GOTO: EOF จะกลับไปที่ใด

เพื่อความเข้าใจคำสั่งที่ใช้และวิธีการทำงานให้เปิดหน้าต่างพรอมต์คำสั่งดำเนินการคำสั่งต่อไปนี้และอ่านหน้าวิธีใช้ทั้งหมดที่แสดงสำหรับแต่ละคำสั่งอย่างระมัดระวัง

  • choice /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

ดูสิ่งนี้ด้วย:


2
นี่เป็นคำตอบที่เหลือเชื่อ จากนี้ไปฉันใช้ Choice.exe เท่านั้น
Bas

1
choice.exe อยู่ใน DOS ตั้งแต่ 6.0
Brian Minton

1
@BrianMinton นั่นไม่ถูกต้อง มีแอปพลิเคชัน 16 บิตCHOICE.COMตามค่าเริ่มต้นบน MS-DOS 6.0, MS-DOS 7.0, Windows 95 และ Windows 98 แต่ไม่มีการchoice.exeติดตั้งตามค่าเริ่มต้นบน Windows NT4, Windows 2000 และ Windows XP CHOICE.COMสามารถใช้กับ NT4, Windows 2000 และ Windows XP ได้ แต่ควรใช้ 32 บิตchoice.exeจากชุดทรัพยากรที่เหมาะสม ฟานเดอร์ร็อบดู Woude's หน้าเกี่ยวกับทางเลือก ตัวเลือกที่มีบางส่วนที่แตกต่างกันระหว่างและCHOICE.COM choice.exeอย่างไรก็ตามคำถามไม่เกี่ยวกับ DOS
Mofi

5

ง่ายขึ้นเล็กน้อย:

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

หรือ

@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

หลังจาก Y ใส่คำสั่งที่คุณต้องการให้เกิดขึ้น นั่นคือสิ่งที่ ... มีไว้เพื่อ :)
Bob Smith

ฉันหมายถึง: %errorlevel%เป็นค่าจำนวนเต็มเสมอ ดูที่นี่สำหรับเอกสารรวมทั้งตัวอย่าง
Stephan

1

นี่คือวิธีการไปสู่คำตอบใช่ / ไม่ใช่

มันไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ด้วย

สิ่งนี้จะตรวจสอบข้อผิดพลาดที่ได้รับจากอินพุตและตั้งค่าchoiceตัวแปรเป็นสิ่งที่คุณต้องการเพื่อให้สามารถใช้ด้านล่างในโค้ดได้

@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

หากคุณต้องการให้โปรแกรมแบตช์กลับไปที่พรอมต์และไม่ปิดพรอมต์ (AKA cmd.exe) คุณสามารถใช้ "exit / b"

สิ่งนี้อาจช่วยได้

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...
)

หรือถ้าไม่อยากใช้เส้นมาก ...

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

หวังว่านี่จะช่วยได้ ...


0

นี่คือตัวอย่างง่ายๆที่ฉันใช้ในสคริปต์การสำรองข้อมูล (.bat / batch) บน Windows 10 ซึ่งทำให้ฉันมีตัวเลือกต่างๆในการสำรองข้อมูล

...

: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!

...

คุณสามารถมีบล็อกเหล่านี้ได้มากเท่าที่คุณต้องการ


0

ขั้นแรกให้เปิดเทอร์มินัล

จากนั้นพิมพ์

cd ~
touch .sure
chmod 700 .sure

จากนั้นเปิด. sure และวางด้านใน

#!/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 ''

หลังจากนั้นปิดไฟล์

~/.sure ; ENTER COMMAND HERE

สิ่งนี้จะแจ้งให้คุณทราบว่าคุณแน่ใจหรือไม่ก่อนดำเนินการคำสั่งต่อไป


อาจจะทุบตี แต่ไม่แน่นอนในชุด
Stephan

โอ้. ฉันเดาว่าไม่. ใช้ได้กับคำสั่งเทอร์มินัลเท่านั้นไม่ใช่คำสั่งแบตช์ ขออภัยสำหรับข้อมูลเท็จ
user13636521

0

คุณสามารถพิจารณาใช้การยืนยัน UI

ด้วยyesnopopup.bat

@echo off

for /f "tokens=* delims=" %%# in ('yesnopopup.bat') do (
    set "result=%%#"
)

if /i result==no (
    echo user rejected the script
    exit /b 1
) 

echo continue

rem --- other commands --

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

ป้อนคำอธิบายภาพที่นี่

ด้วยสคริปต์เดียวกันคุณสามารถใช้iexpYNbutton.batซึ่งจะสร้างป๊อปอัปที่คล้ายกัน

ด้วยbutton.batคุณสามารถลองใช้สคริปต์ต่อไปนี้:

@echo off

for /f "tokens=* delims=" %%# in ('buttons.bat "Yep!" "Nope!" ') do (
    set "result=%%#"
)

if /i result==2 (
    echo user rejected the script
    exit /b 1
) 

echo continue

rem --- other commands --

และผู้ใช้จะเห็น:

ป้อนคำอธิบายภาพที่นี่


-2

เปิดเทอร์มินัล พิมพ์ดังต่อไปนี้

echo>sure.sh
chmod 700 sure.sh

วางสิ่งนี้ไว้ข้างใน sure.sh

#!\bin\bash

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

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

exit 0

ปิด sure.sh แล้วพิมพ์ใน terminal

alias sure='~/sure&&'

ตอนนี้ถ้าคุณพิมพ์ให้แน่ใจก่อนพิมพ์คำสั่งมันจะแจ้งให้คุณแน่ใจก่อนที่จะดำเนินการต่อ

หวังว่านี่จะเป็นประโยชน์!


อาจจะทุบตี แต่ไม่แน่นอนในชุด
Stephan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.