मैं एक विंडोज़ बैचफाइल में "क्या आप निश्चित हैं" शीघ्र बना सकते हैं?


94

मेरे पास एक बैच फ़ाइल है जो फ़ाइलों के एक गुच्छा को एक स्थान से दूसरे स्थान पर कॉपी करती है और मेरे लिए वापस आती है। केवल एक चीज उतनी ही है जितनी यह मेरी मदद करती है कि मैं गलती से उस कमांड को अपने कमांड बफर और मास ओवर राइटिंग बदलावों का चयन करते हुए रखता हूं।

मेरे द्वारा .bat फ़ाइल के लिए मुझे किस कोड की आवश्यकता होगी, यह कहने के लिए कि "क्या आप निश्चित हैं", और बाकी फ़ाइल चलाने से पहले मुझे "y" लिखें? यदि कुछ भी है लेकिन "y" टाइप किया गया है तो उस लाइन पर निष्पादन से बाहर निकलना चाहिए।

27 नवंबर को संपादित करें ओके मैंने इस अनुत्तरित को फिर से चिह्नित किया क्योंकि मैं अभी भी इसका पता नहीं लगा सकता। जब मैं "बाहर निकलें" कहता हूं यह cmd.exe को बंद कर देता है जो कि मैं नहीं चाहता। यह सब इसलिए क्योंकि विंडोज ने कमांड बफर को गलत तरीके से लागू किया है [अलग से जो मुझे कम से कम इस्तेमाल किया जाता है]

जवाबों:


168

आप कुछ इस तरह चाहते हैं:

@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 आप शायद सही हैं। मुझे लगता है कि मैंने अपने कोड में याद किया।
तपिर

2
... महत्वपूर्ण दो पंक्तियों के बारे में कुछ व्याख्यात्मक शब्दों के साथ अधिक मूल्यवान होगा ।
वुल्फ

@ जो शायद वह (मेरी तरह) नहीं कर सकता क्योंकि वह उन्हें (अभी तक) नहीं समझता है। इसलिए यदि आप ऐसा करते हैं, तो यह आश्चर्यजनक होगा कि आप अपने उत्तर या संसाधनों के लिंक को विस्तार से बता सकते हैं :)
मार्कस मैंगल्सडॉर्फ

32

CHOICE कमांड का प्रयास करें , जैसे

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

8
<दिखावा> हालांकि यह अपेक्षाकृत नया है। इसे 1993 या 1994 में MS-DOS 6 में जोड़ा गया था, इसलिए यह सभी कार्यान्वयन के साथ काम नहीं कर सकता है </ शो बंद>
नाथन फेलमैन

7
वास्तव में पसंद का उपयोग कैसे करें इसका उदाहरण यहां computerhope.com/issues/ch001674.htm
मैथ्यू लॉक

15

choiceआदेश हर जगह उपलब्ध नहीं है। नए विंडोज संस्करणों के साथ, setकमांड में आपके पास /pउपयोगकर्ता इनपुट प्राप्त करने का विकल्प होता है

SET /P variable=[promptString]

set /?अधिक जानकारी के लिए देखें


... स्वीकार किए जाते हैं की तुलना में बहुत अधिक व्यावहारिक, लेकिन हम स्पष्ट रूप से जरूरी समय में रहते हैं।
वुल्फ

8

विंडोज़ कमांड लाइन पर उपयोगकर्ता संकेतों के लिए दो कमांड उपलब्ध हैं:

  • /Pसक्षम कमांड एक्सटेंशन के साथ सभी विंडोज़ एनटी संस्करणों पर उपलब्ध विकल्प के साथ सेट करें और
  • choice.exe Windows Vista पर डिफ़ॉल्ट और पीसी उपयोगकर्ताओं के लिए और Windows Server 2003 और Windows के बाद के सर्वर संस्करण पर बाद में विंडोज संस्करणों से उपलब्ध।

सेट विंडोज कमांड प्रोसेसर का एक आंतरिक कमांड है cmd.exe/Pएक स्ट्रिंग के लिए एक उपयोगकर्ता को संकेत करने का विकल्प केवल सक्षम कमांड एक्सटेंशन के साथ उपलब्ध है जो डिफ़ॉल्ट रूप से सक्षम हैं अन्यथा आजकल लगभग कोई बैच फ़ाइल काम नहीं करेगी।

पसंद। exe एक अलग कंसोल एप्लीकेशन (बाहरी कमांड) है, जिसमें स्थित है %SystemRoot%\System32choice.exeविंडोज सर्वर 2003 को %SystemRoot%\System32विंडोज एक्सपी मशीन पर निर्देशिका में विंडोज एक्सपी पर उपयोग के लिए कॉपी किया जा सकता है , जैसे कि कई अन्य कमांड विंडोज एक्सपी पर डिफ़ॉल्ट रूप से उपलब्ध नहीं हैं, लेकिन विंडोज सर्वर 2003 पर डिफ़ॉल्ट रूप से उपलब्ध हैं।

निम्नलिखित कारणों से SET / P के उपयोग पर CHOICE के उपयोग का पक्ष लेना सबसे अच्छा अभ्यास है :

  1. विकल्प विकल्प (और ) के बाद निर्दिष्ट केवल चाबियों (क्रमशः STDIN से पढ़े गए अक्षर ) को स्वीकार करता है और यदि उपयोगकर्ता गलत कुंजी दबाता है तो त्रुटि बीप को आउटपुट करता है।/CCtrl+C
  2. CHOICE को किसी स्वीकार्य व्यक्ति की तुलना में किसी अन्य कुंजी को दबाने की आवश्यकता नहीं है। एक बार स्वीकार्य कुंजी दबाए जाने के बाद CHOICE तुरंत बाहर निकल जाती है जबकि SET / P के लिए आवश्यक है कि उपयोगकर्ता इनपुट के साथ RETURNया समाप्त करे ENTER
  3. उपयोगकर्ता की प्रतीक्षा किए बिना कुछ सेकंड के बाद डिफ़ॉल्ट विकल्प के साथ डिफ़ॉल्ट विकल्प के साथ स्वचालित रूप से जारी रखने के लिए CHOICE के साथ संभव है ।
  4. तुरंत दूसरे बैच फ़ाइल से प्रॉम्प्ट को स्वचालित रूप से उत्तर देने पर आउटपुट बेहतर होता है, जो CHOICEecho Y | call PromptExample.bat का उपयोग करने की तरह ही प्रॉम्प्ट के साथ बैच फ़ाइल को कॉल करता है ।
  5. उपयोगकर्ता की पसंद के मूल्यांकन के साथ बहुत आसान है की पसंद की वजह से पसंद दबाया कुंजी (चरित्र) जो करने के लिए असाइन किया गया है के अनुसार एक मूल्य के साथ बाहर निकलता है ERRORLEVEL जो आसानी से अगले मूल्यांकन किया जा सकता।
  6. SET / P पर उपयोग किए जाने वाले पर्यावरण चर को परिभाषित नहीं किया जाता है यदि उपयोगकर्ता केवल कुंजी दबाता है RETURNया ENTERउपयोगकर्ता को संकेत देने से पहले इसे परिभाषित नहीं किया गया है। SET / P कमांड लाइन पर उपयोग किया गया पर्यावरण वैरिएबल वर्तमान मान रखता है यदि पहले परिभाषित किया गया है और उपयोगकर्ता बस RETURNया दबाता है ENTER
  7. उपयोगकर्ता को एक स्ट्रिंग सहित SET / P के साथ संकेत दिए जाने पर कुछ भी दर्ज करने की स्वतंत्रता है, जो बाद में cmdएक सिंटैक्स त्रुटि के कारण बैच फ़ाइल निष्पादन से बाहर निकलता है , या बैच फ़ाइल में कमांड के निष्पादन में बिल्कुल भी शामिल नहीं है। अच्छा कोडित बैच फ़ाइल। यह गलती से या जानबूझकर गलत उपयोगकर्ता इनपुट के खिलाफ सेट / पी सुरक्षित करने के लिए कुछ प्रयासों की आवश्यकता है ।

यहाँ वरीय का उपयोग कर एक शीघ्र उदाहरण है की पसंद और वैकल्पिक रूप से सेट / पी पर choice.exeWindows चला प्रयुक्त कंप्यूटर पर उपलब्ध नहीं है।

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

नोट: यह बैच फ़ाइल कमांड एक्सटेंशन का उपयोग करती है, जो कमांड दुभाषिया के command.comबजाय विंडोज 95/98 / ME पर उपलब्ध नहीं हैं cmd.exe

कमांड लाइन set "UserChoice=!UserChoice: =!"को इस बैच फ़ाइल echo Y | call PromptExample.batको Windows NT4 / 2000 / XP पर कॉल करना संभव बनाने के लिए जोड़ा जाता है और इसके उपयोग की आवश्यकता नहीं होती है echo Y| call PromptExample.bat। यह दो स्ट्रिंग तुलनाओं को चलाने से पहले STDIN से पढ़े गए स्ट्रिंग से सभी रिक्त स्थान को हटा देता है ।

echo Y | call PromptExample.batY में परिणाम SPACEपर्यावरण चर को सौंपा जा रहा है UserChoice। इसका परिणाम यह होगा कि दो बार प्रॉम्प्ट को संसाधित करने के "Y "कारण न तो केस-असंवेदनशील समान है "N"और न ही "Y"पहले सभी रिक्त स्थान को हटाने के बिना। तो UserChoiceसाथ वाईSPACE के रूप में मूल्य के विकल्प के साथ शीघ्र दूसरी बार चल रहा है में परिणाम होगा Nके रूप में दूसरा शीघ्र निष्पादन पर बैच फ़ाइल में डिफ़ॉल्ट रूप में परिभाषित किया जो बैच फ़ाइल संसाधन के एक अप्रत्याशित बाहर निकलने में अगले परिणाम नहीं। हां, SET / P का सुरक्षित उपयोग वास्तव में मुश्किल है, है ना?

विकल्पों की एक सूची में से एक विकल्प के लिए उपयोगकर्ता को संकेत देने के लिए SET / P और CHOICE के उपयोग पर और भी अधिक विवरण के लिए , गलत उपयोगकर्ता इनपुट पर बैच फ़ाइल निष्पादन को छोड़ने से विंडोज कमांड दुभाषिया को रोकने के लिए कैसे देखें ?

कुछ और संकेत:

  1. यदि तुलना दो तार के साथ और तुलना ऑपरेटर के दाईं से बाईं सहित दोहरे उद्धरण चिह्नों। इसलिए केस-असंवेदनशील के UserChoiceसाथ Nऔर का मूल्य नहीं है Y, लेकिन साथ में UserChoiceघिरा हुआ और का मूल्य है ।""N""Y"
  2. यदि तुलना ऑपरेटरों EQUऔर NEQरेंज में दो पूर्णांकों की तुलना -२१४७४८३६४८ 2147483647 के लिए और दो तार की तुलना के लिए नहीं प्राथमिक डिजाइन किए हैं। EQUऔर NEQस्ट्रिंग्स की तुलना के लिए भी काम करते हैं, लेकिन परिणाम के लिए डबल स्ट्रिंग में एक स्ट्रिंग के लिए बाएं स्ट्रिंग को पूर्णांक में बदलने के लिए दोहरे उद्धरणों में स्ट्रिंग्स की तुलना करते हैं। EQUऔर NEQकेवल सक्षम कमांड एक्सटेंशन के साथ उपयोग किया जा सकता है। स्ट्रिंग तुलना के लिए तुलना ऑपरेटर हैं ==और not ... ==जो command.comMS-DOS और Windows 95/98 / ME के रूप में भी अक्षम कमांड एक्सटेंशन के साथ काम करते हैं, उन्होंने भी उनका समर्थन किया है। IF तुलना संचालकों के बारे में अधिक जानकारी के लिए, Windows बैच फ़ाइलों में NEQ, LSS, GTR, आदि के बराबर प्रतीक देखें ।
  3. कमांड goto :EOFको वास्तव में बैच फ़ाइल प्रसंस्करण से बाहर निकलने के लिए सक्षम कमांड एक्सटेंशन की आवश्यकता होती है। अधिक जानकारी के लिए देखें कि GOTO: EOF कहां लौटेगा?

उपयोग की गई कमांड को समझने के लिए और वे कैसे काम करते हैं, कमांड प्रॉम्प्ट विंडो खोलें, वहां निम्नलिखित कमांड निष्पादित करें, और प्रत्येक कमांड के लिए प्रदर्शित पूरी तरह से सभी सहायता पृष्ठों को बहुत सावधानी से पढ़ें।

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

यह सभी देखें:


1
यह एक अविश्वसनीय जवाब है। मैं अभी से केवल च्वाइस। Exe का उपयोग कर रहा हूँ।
बास

choice.exe भी DOS में 6.0 के बाद से था
ब्रायन मिंटन

@ ब्रायनमिंटन यह सही नहीं है। CHOICE.COMMS-DOS 6.0, MS-DOS 7.0, Windows 95 और Windows 98 पर डिफ़ॉल्ट रूप से 16-बिट अनुप्रयोग उपलब्ध था । लेकिन choice.exeWindows NT4, Windows 2000 और Windows XP पर डिफ़ॉल्ट रूप से कोई इंस्टॉल नहीं किया गया था । CHOICE.COMNT4, Windows 2000 और Windows XP पर भी उपयोग किया जा सकता है, लेकिन choice.exeउपयुक्त संसाधन किट से 32-बिट का उपयोग करना बेहतर होगा । CHOICE के बारे में Rob van der Woude´s पृष्ठ देखें । विकल्प आंशिक रूप से CHOICE.COMऔर के बीच भिन्न होते हैं choice.exe। हालांकि, सवाल डॉस के बारे में नहीं है।
मोफी

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 के बाद आप जो कुछ भी करना चाहते हैं वह कमांड डालें। यह है ... के लिए कर रहे हैं :)
बॉब स्मिथ

मेरा मतलब था: %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) को बंद नहीं करना चाहते हैं, तो आप "एक्जिट / बी" का उपयोग कर सकते हैं।

यह मदद कर सकता है।

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

यहां एक सरल उदाहरण है जो मैं विंडोज 10 पर एक बैकअप (.bat / बैच) स्क्रिप्ट में उपयोग करता हूं, जो मुझे बैकअप बनाते समय अलग-अलग विकल्प रखने की अनुमति देता है।

...

: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

-1

टर्मिनल खोलें। निम्नलिखित टाइप करें

echo>sure.sh
chmod 700 sure.sh

यह सुनिश्चित अंदर पेस्ट करें

#!\bin\bash

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

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

exit 0

टर्मिनल में बंद करें और टाइप करें।

alias sure='~/sure&&'

अब, यदि आप कमांड टाइप करने से पहले सुनिश्चित करते हैं, तो यह आपको कमांड जारी रखने से पहले सुनिश्चित कर देगा।

आशा है कि यह उपयोगी है!


शायद बैश में, लेकिन निश्चित रूप से बैच में नहीं।
Stephan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.