Windows toplu dosyasında "emin misiniz" istemini nasıl oluşturabilirim?


96

Bir grup dosyayı bir yerden diğerine ve benim için geri kopyalamayı otomatikleştiren bir toplu iş dosyam var. Tek şey, komut arabelleğimden yanlışlıkla bu komutu seçmeme ve beklenmeyen değişikliklerin toplu olarak üzerine yazmama yardımcı olduğu kadar.

.Bat dosyamın "emin misin" demesi ve dosyanın geri kalanını çalıştırmadan önce "y" yazmam için hangi koda ihtiyacım var? "Y" dışında herhangi bir şey yazılırsa, o satırda yürütmeden çıkmalıdır.

27 Kasım'ı Düzenle Tamam Bunu yine cevapsız olarak işaretledim çünkü hala çözemiyorum. "Çıkış" dediğimde; istediğim şey olmayan cmd.exe'yi kapatıyor. Tüm bunlar, Windows'un komut arabelleğini yanlış uyguladığı için [en azından alıştığımdan farklı]

Yanıtlar:


172

Şunun gibi bir şey istiyorsun:

@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
Ekleyeceğim tek şey SET AREYOUSURE=N, komut dosyasını daha önce o komut penceresinde çalıştırdıysanız, seçimi temizlemek için komut isteminden önce ek bir şeydir . Bu olmadan varsayılan, önceden seçilen seçim olarak kalacaktır.
isapir

4
@Igal'in setlocalve endlocalbununla ilgilenmesi gerektiğinden oldukça eminim . %AREYOUSURE%sonra artık var olmayacak endlocal.

1
@dudeprgm muhtemelen haklısın. Kodumda olanları kaçırdığımı düşünüyorum.
isapir

3
... önemli iki satırla ilgili bazı açıklayıcı sözlerle daha değerli olacaktır .
Wolf

@Joe Belki de yapamıyor çünkü (benim gibi) (henüz) anlamıyor. Öyleyse, eğer bunu yaparsanız, cevabınızı genişletebilir veya onu açıklayan kaynaklara bağlantı verebilirseniz harika olur :)
Marcus Mangelsdorf


17

choiceKomut her yerde mevcut değildir. Daha yeni Windows sürümlerinde setkomut, /pkullanıcı girişi alma seçeneğine sahiptir.

SET /P variable=[promptString]

set /?daha fazla bilgi için bakın


... kabul edilenden çok daha anlayışlı, ama belli ki acil zamanlarda yaşıyoruz.
Wolf

12

Windows komut satırında kullanıcı istemleri için kullanılabilen iki komut vardır:

  • /PEtkinleştirilmiş komut uzantılarına sahip tüm Windows NT sürümlerinde bulunan seçenekle ayarla ve
  • choice.exe , Windows Vista ve sonraki Windows sürümlerinde PC kullanıcıları için ve Windows Server 2003 ve sonraki sunucu sürümlerinde varsayılan olarak kullanılabilir.

set , Windows komut işlemcisinin dahili bir komutudur cmd.exe. /PBir kullanıcıdan bir dizeyi sorma seçeneği , yalnızca varsayılan olarak etkinleştirilmiş etkin komut uzantılarıyla kullanılabilir, aksi takdirde artık neredeyse hiçbir toplu iş dosyası çalışmaz.

choice.exe , içinde bulunan ayrı bir konsol uygulamasıdır (harici komut) %SystemRoot%\System32. choice.exeWindows Server 2003'ün, %SystemRoot%\System32Windows XP'de varsayılan olarak bulunmayan ancak Windows Server 2003'te varsayılan olarak bulunan diğer birçok komut gibi Windows XP'de kullanım için bir Windows XP makinesindeki dizine kopyalanabilir .

Bu bir iyilik kullanımına en iyi yöntemdir SEÇİM kullanımı üzerinde SET / P aşağıdaki nedenlerden dolayı:

  1. SEÇİM , yalnızca (ve ) seçeneğinden sonra belirtilen tuşları (sırasıyla STDIN'den okunan karakterler) kabul eder ve kullanıcı yanlış bir tuşa basarsa bir hata sesi çıkarır./CCtrl+C
  2. SEÇİM , kabul edilebilir olanlardan başka herhangi bir tuşa basmayı gerektirmez. SEÇİM , kabul edilebilir bir tuşa basıldığında hemen çıkar, SET / P ise kullanıcının RETURNveya ile girişi bitirmesini gerektirir ENTER.
  3. İle mümkündür SEÇİM otomatik kullanıcı beklemeden bazı saniye sonra varsayılan seçeneği ile devam etmek için bir varsayılan seçeneği ve bir zaman aşımı tanımlamak için.
  4. Çıktı gibi istemi kullanılarak şey ile toplu dosyasını çağırır başka toplu dosyasından otomatik istemi yanıtlayan üzerinde daha iyidir echo Y | call PromptExample.batkullanımı hakkında SEÇİM .
  5. Kullanıcının seçtiği değerlendirilmesi ile çok daha kolaydır SEÇİM nedeniyle SEÇİM atanan preslenmiş tuşunun (karakter) 'e göre bir değerle çıkar ERRORLEVEL kolayca sonraki değerlendirilebilir.
  6. SET / P'de kullanılan ortam değişkeni , kullanıcı sadece tuşa bastığında RETURNveya ENTERkullanıcıya sorulmadan önce tanımlanmadıysa tanımlanmaz. SET / P komut satırında kullanılan ortam değişkeni, önceden tanımlanmışsa mevcut değerini korur ve kullanıcı sadece RETURNveya tuşuna basar ENTER.
  7. Kullanıcı, SET / P ile istendiğinde, daha sonra cmdbir sözdizimi hatası nedeniyle toplu iş dosyasının yürütülmesinden çıkılmasına veya toplu iş dosyasında hiç bulunmayan komutların yürütülmesine neden olan bir dize dahil herhangi bir şey girme özgürlüğüne sahiptir. iyi kodlanmış toplu iş dosyası. SET / P'yi yanlışlıkla veya kasıtlı olarak yanlış kullanıcı girdisine karşı güvenli hale getirmek için biraz çaba gösterilmesi gerekiyor .

Burada tercih edilen kullanarak hızlı bir örnektir SEÇİM alternatif olarak ve SET / P ile choice.exeWindows işletim kullanılan bilgisayar üzerinde mevcut.

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

Not: Bu toplu iş dosyası, komut yorumlayıcı command.comyerine Windows 95/98 / ME'de bulunmayan komut uzantılarını kullanır cmd.exe.

Komut satırı set "UserChoice=!UserChoice: =!", echo Y | call PromptExample.batWindows NT4 / 2000 / XP'de bu toplu iş dosyasını çağırmayı mümkün kılmak için eklenir ve kullanımını gerektirmez echo Y| call PromptExample.bat. İki dize karşılaştırmasını çalıştırmadan önce STDIN'den okunan dizedeki tüm boşlukları siler .

echo Y | call PromptExample.batY'ninSPACE ortam değişkenine atanmasıyla sonuçlanır UserChoice. Bu "Y ", ne büyük / küçük harfe duyarlı "N"olmadığından veya "Y"ilk olarak tüm boşlukları silmeden istemi iki kez işlemekle sonuçlanır . Bu nedenle UserChoice, değer olarak YSPACE ile N, ikinci komut istemi yürütmesinde toplu iş dosyasında varsayılan olarak tanımlanan seçenekle istemin ikinci kez çalıştırılmasıyla sonuçlanır ve bu , daha sonra toplu iş dosyası işlemenin beklenmedik bir şekilde çıkmasıyla sonuçlanır. Evet, SET / P'nin güvenli kullanımı gerçekten aldatıcı, değil mi?

SET / P ve CHOICE kullanımıyla ilgili daha fazla ayrıntı için, bir seçenek listesinden kullanıcıya bir seçenek sorma konusunda daha fazla ayrıntı için, Windows komut yorumlayıcısının yanlış bir kullanıcı girişinde toplu dosya yürütmeden çıkmasını nasıl durdurabilirim?

Birkaç ipucu daha:

  1. IF , karşılaştırma işlecinin sol ve sağındaki iki dizeyi çift ​​tırnak dahil ederek karşılaştırır . Karşılaştırıldığında küçük harf duyarsız değeri olmadığı Yani UserChoicebirlikte Nve Yfakat değeri UserChoiceile çevrili "olan "N"ve "Y".
  2. EĞER karşılaştırma operatörleri EQUve NEQaralıkta iki tamsayı karşılaştıran -2147483648 2147483647 için değil, iki dizeyi karşılaştırmak için birincil tasarlanmıştır. EQUve NEQdizge karşılaştırmaları için de çalışır, ancak sol dizeyi bir tam sayıya dönüştürmek için gereksiz bir girişimde çift tırnak içindeki dizeleri karşılaştırmaya neden olur. EQUve NEQyalnızca etkin komut uzantılarıyla kullanılabilir. Dize karşılaştırmaları için karşılaştırma operatörleri ==ve not ... ==hatta hatta engelli komut uzantıları ile hangi iş command.comMS-DOS ve / 98, Windows 95 / ME zaten onları destekledi. IF karşılaştırma operatörleri hakkında daha fazla ayrıntı için bkz . Windows toplu iş dosyalarında NEQ, LSS, GTR, vb. İle eşdeğer Sembol .
  3. Komut goto :EOF, toplu iş dosyası işlemeden gerçekten çıkmak için etkinleştirilmiş komut uzantılarını gerektirir. Daha fazla ayrıntı için bkz. GOTO: EOF nereye dönüyor?

Kullanılan komutları ve nasıl çalıştıklarını anlamak için bir komut istemi penceresi açın, aşağıdaki komutları uygulayın ve her komut için görüntülenen tüm yardım sayfalarını çok dikkatli bir şekilde okuyun.

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

Ayrıca bakınız:


2
Bu inanılmaz bir cevap. Şu andan itibaren yalnızca Choice.exe kullanıyorum.
Bas

1
choice.exe ayrıca 6.0'dan beri DOS'taydı
Brian Minton

1
@BrianMinton Bu doğru değil. 16-bit uygulama CHOICE.COMMS-DOS 6.0, MS-DOS 7.0, Windows 95 ve Windows 98'de choice.exevarsayılan olarak mevcuttu. Ancak Windows NT4, Windows 2000 ve Windows XP'de varsayılan olarak yüklü değildi . CHOICE.COMNT4, Windows 2000 ve Windows XP'de de kullanılabilir, ancak choice.exeuygun kaynak kitinden 32 bit kullanmak daha iyi olacaktır . Rob van der Woude´un CHOICE hakkındaki sayfasına bakın . Seçenekler, CHOICE.COMve arasında kısmen farklıdır choice.exe. Ancak soru DOS ile ilgili değil.
Mofi

5

İşte biraz daha kolay:

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

veya

@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'den sonra olmasını istediğiniz komutu girin. Bunun için ... bunlar :)
Bob Smith

Demek istediğim: %errorlevel%her zaman bir tamsayı değeridir. Örnek içeren belgeler için buraya bakın .
Stephan

1

İşte evet / hayır cevabı için benim gitme yöntemim .

Ayrıca büyük / küçük harf duyarlı değildir.

Bu sadece girdi tarafından verilen hataları kontrol eder ve choicedeğişkeni istediğiniz her şeye ayarlar, böylece aşağıdaki kodda kullanılabilir.

@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

Toplu iş programının komut istemine geri dönmesini ve istemi (AKA cmd.exe) kapatmasını istemiyorsanız, "exit / b" yi kullanabilirsiniz.

Bu yardımcı olabilir.

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

Veya bu kadar çok satır kullanmak istemiyorsanız ...

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

Bu yardımcı olur umarım...


0

İşte Windows 10'da bir yedekleme (.bat / batch) komut dosyasında kullandığım basit bir örnek, yedekleme yaparken farklı seçeneklere sahip olmamı sağlıyor.

...

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

...

Bu bloklardan ihtiyacınız olduğu kadarına sahip olabilirsiniz.


0

İlk önce terminali açın.

Sonra yazın

cd ~
touch .sure
chmod 700 .sure

Sonra, emin olun ve bunu içine yapıştırın.

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

Bundan sonra dosyayı kapatın.

~/.sure ; ENTER COMMAND HERE

Bu size komuta devam etmeden önce emin olup olmadığınızı soracaktır.


Belki partide, ama kesinlikle toplu olarak değil.
Stephan

Oh. Sanırım hayır. Yalnızca terminal komutları için çalışır, toplu komutlar için değil. Yanlış bilgi için özür dilerim.
user13636521

0

Bir UI onayı kullanmayı düşünebilirsiniz.

ile 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 --

kullanıcı aşağıdakileri görecek ve seçime bağlı olarak komut dosyası devam edecek:

görüntü açıklamasını buraya girin

kesinlikle aynı komut dosyası ile iexpYNbutton.bat'ı da kullanabilirsiniz, bu da benzer bir açılır pencere oluşturur.

Buttons.bat ile aşağıdaki komut dosyasını deneyebilirsiniz:

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

ve kullanıcı şunu görecektir:

görüntü açıklamasını buraya girin


-2

Terminali açın. Aşağıdakileri yazın

echo>sure.sh
chmod 700 sure.sh

Bunu kesinlikle içine yapıştırın.sh

#!\bin\bash

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

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

exit 0

Sure.sh'yi kapatın ve bunu terminale yazın.

alias sure='~/sure&&'

Şimdi, komutu yazmadan önce emin yazarsanız, komuta devam etmeden önce size bir emin misiniz istemi verecektir.

Umarım bu yardımcı olur!


Belki partide, ama kesinlikle toplu olarak değil.
Stephan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.