Wie kann ich in einer Windows-Batchdatei eine Eingabeaufforderung "Sind Sie sicher" erstellen?


93

Ich habe eine Batch-Datei, die das Kopieren einer Reihe von Dateien von einem Ort zum anderen und zurück für mich automatisiert. Das Einzige ist, dass es mir hilft, diesen Befehl versehentlich aus meinem Befehlspuffer auszuwählen und nicht festgeschriebene Änderungen massenhaft zu überschreiben.

Welchen Code würde ich für meine .bat-Datei benötigen, damit sie "Sind Sie sicher" sagt und "y" eingibt, bevor der Rest der Datei ausgeführt wird? Wenn etwas anderes als "y" eingegeben wird, sollte die Ausführung in dieser Zeile beendet werden.

Bearbeiten 27. November Ok, ich habe dies erneut als unbeantwortet markiert, da ich es immer noch nicht herausfinden kann. Wenn ich "exit" rufe; es schließt cmd.exe, was nicht das ist, was ich will. All dies, weil Windows den Befehlspuffer falsch implementiert hat [anders als ich es zumindest gewohnt bin]

Antworten:


168

Du willst so etwas wie:

@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
Das einzige, was ich hinzufügen würde, ist ein zusätzliches SET AREYOUSURE=Nvor der Eingabeaufforderung, um die Auswahl zu löschen, wenn Sie das Skript bereits zuvor in diesem Befehlsfenster ausgeführt haben. Ohne diese Option bleibt die Standardeinstellung die zuvor ausgewählte Auswahl.
Isapir

4
@Igal Ich bin mir ziemlich sicher, dass das setlocalund das endlocalsich darum kümmern sollten. %AREYOUSURE%wird nach dem nicht mehr existieren endlocal.

1
@dudeprgm du hast wahrscheinlich recht. Ich denke, dass ich diese in meinem Code verpasst habe.
Isapir

2
... wäre wertvoller mit einigen erklärenden Worten zu den beiden wichtigen Zeilen .
Wolf

@ Joe Vielleicht kann er es nicht, weil er sie (wie ich) (noch) nicht versteht. Wenn Sie dies tun, wäre es erstaunlich, wenn Sie Ihre Antwort erweitern oder auf Ressourcen verweisen könnten, die dies erklären :)
Marcus Mangelsdorf


15

Der choiceBefehl ist nicht überall verfügbar. Bei neueren Windows-Versionen bietet der setBefehl die /pOption, Benutzereingaben abzurufen

SET /P variable=[promptString]

siehe set /?für weitere Informationen


... viel aufschlussreicher als die akzeptierte, aber wir leben offensichtlich in dringenden Zeiten.
Wolf

8

Für Benutzeransagen in der Windows-Befehlszeile stehen zwei Befehle zur Verfügung:

  • Set mit Option /Pfür alle Windows NT-Versionen mit aktivierten Befehlserweiterungen und
  • choice.exe ist standardmäßig unter Windows Vista und späteren Windows-Versionen für PC-Benutzer sowie unter Windows Server 2003 und späteren Serverversionen von Windows verfügbar.

einstellen ist ein interner Befehl des Windows-Befehlsprozessors cmd.exe. Die Option /P, einen Benutzer zur Eingabe einer Zeichenfolge aufzufordern, ist nur mit aktivierten Befehlserweiterungen verfügbar, die standardmäßig aktiviert sind, da sonst fast keine Batchdatei mehr funktionieren würde.

choice.exe ist eine separate Konsolenanwendung (externer Befehl) in %SystemRoot%\System32.choice.exevon Windows Server 2003 kann %SystemRoot%\System32zur Verwendung unter Windows XP in ein Verzeichnis auf einem Windows XP-Computer kopiert werden, wie viele andere Befehle, die unter Windows XP nicht standardmäßig, unter Windows Server 2003 jedoch standardmäßig verfügbar sind.

Es wird empfohlen, die Verwendung von CHOICE der Verwendung von SET / P vorzuziehen aus folgenden Gründen :

  1. CHOICE akzeptiert nur Schlüssel (bzw. aus STDIN gelesene Zeichen ), die nach der Option angegeben wurden/C (und Ctrl+C) angegeben wurden, und gibt einen Fehlerton aus, wenn der Benutzer eine falsche Taste drückt.
  2. Für CHOICE muss keine andere Taste als eine der zulässigen gedrückt werden. CHOICE wird sofort beendet, sobald eine akzeptable Taste gedrückt wird, während SET / P erfordert, dass der Benutzer die Eingabe mit RETURNoder beendetENTER .
  3. Es ist möglich mit CHOICE , eine Standardoption und ein Timeout zu definieren, um nach einigen Sekunden automatisch mit der Standardoption fortzufahren, ohne auf den Benutzer zu warten.
  4. Die Ausgabe ist besser, wenn die Eingabeaufforderung automatisch aus einer anderen Batchdatei beantwortet wird, die die Batchdatei mit der Eingabeaufforderung mit etwas wie echo Y | call PromptExample.batbei Verwendung aufruft aufruft, beispielsweise CHOICE .
  5. Die Bewertung der Auswahl des Benutzers ist mit CHOICE viel einfacher, da CHOICE mit einem Wert entsprechend der gedrückten Taste (Zeichen) beendet wird, die ERRORLEVEL zugewiesen ist ist und als nächstes leicht ausgewertet werden kann.
  6. Die in SET / P verwendete Umgebungsvariable ist nicht definiert, wenn der Benutzer nur die Taste drückt RETURNoder ENTERund sie wurde nicht definiert, bevor der Benutzer dazu aufgefordert wurde. Die verwendete Umgebungsvariable in der SET / P- Befehlszeile behält ihren aktuellen Wert bei, wenn sie zuvor definiert wurde, und der Benutzer drückt nur RETURNoderENTER .
  7. Der Benutzer hat die Freiheit, bei Aufforderung mit SET / P alles einzugeben, einschließlich einer Zeichenfolge, die später cmdaufgrund eines Syntaxfehlers zum Beenden der Ausführung der Batchdatei führt, oder zur Ausführung von Befehlen, die in der Batchdatei überhaupt nicht enthalten sind gut codierte Batch-Datei. Es bedarf einiger Anstrengungen, um SET / P zu erhalten gegen versehentliche oder absichtlich falsche Benutzereingaben zu schützen.

Hier ist ein Beispiel für eine Eingabeaufforderung mit bevorzugter WAHL und alternativ SET / P ein choice.exe, das auf einem verwendeten Computer unter Windows nicht verfügbar ist.

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

Hinweis: Diese Batchdatei verwendet Befehlserweiterungen, die unter Windows 95/98 / ME nicht verfügbar sindcommand.com anstelle von cmd.exeals Befehlsinterpreter.

Die Befehlszeile set "UserChoice=!UserChoice: =!"wird hinzugefügt, um das Aufrufen dieser Batchdatei unter echo Y | call PromptExample.batWindows NT4 / 2000 / XP zu ermöglichen, ohne dass die Verwendung von erforderlich ist echo Y| call PromptExample.bat. Es löscht alle Leerzeichen aus der Zeichenfolge, aus der gelesen wird STDIN Zeichenfolge, bevor die beiden Zeichenfolgenvergleiche ausgeführt werden.

echo Y | call PromptExample.batführt dazu, dass YSPACE der Umgebungsvariablen zugewiesen wird UserChoice. Dies würde dazu führen, dass die Eingabeaufforderung zweimal verarbeitet wird, da "Y "weder die Groß- und Kleinschreibung gleich ist, "N"noch "Y"ohne zuerst alle Leerzeichen zu löschen. So UserChoicemit YSPACE als Wert bei der Führung das prompt ein zweites Mal mit der Option würde Nals als Standard in der Batch - Datei auf dem zweiten prompte Ausführung des nächste zu einem unerwarteten Ausgang der Stapelverarbeitung definiert. Ja, die sichere Verwendung von SET / P ist wirklich schwierig, nicht wahr?

Weitere Informationen zur Verwendung von SET / P und CHOICE, um den Benutzer zur Auswahl aus einer Liste von Optionen aufzufordern , finden Sie unter Antwort auf So verhindern Sie, dass der Windows-Befehlsinterpreter die Ausführung von Batchdateien bei einer falschen Benutzereingabe beendet.

Noch ein paar Hinweise:

  1. IF vergleicht die beiden Strings mit und rechts des Vergleichsoperator links einschließlich die doppelten Anführungszeichen. Der Vergleich zwischen Groß- und Kleinschreibung ist also nicht der Wert von UserChoicemit Nund Y, sondern der Wert von UserChoiceumgeben von "mit "N"und "Y".
  2. Die IF- Vergleichsoperatoren EQUund NEQsind primär für den Vergleich zweier Ganzzahlen im Bereich von -2147483648 bis 2147483647 und nicht für den Vergleich zweier Zeichenfolgen ausgelegt. EQUund NEQfunktionieren auch für Zeichenfolgenvergleiche, führen jedoch zum Vergleichen von Zeichenfolgen in doppelten Anführungszeichen bei einem nutzlosen Versuch, die linke Zeichenfolge in eine Ganzzahl umzuwandeln. EQUund NEQkann nur mit aktivierten Befehlserweiterungen verwendet werden. Die Vergleichsoperatoren für Zeichenfolgenvergleiche sind ==und not ... ==funktionieren auch mit deaktivierten Befehlserweiterungen, da sie auch command.comvon MS-DOS und Windows 95/98 / ME bereits unterstützt werden. Weitere Informationen zu IF- Vergleichsoperatoren finden Sie unter Symbol, das NEQ, LSS, GTR usw. in Windows-Batchdateien entspricht .
  3. Der Befehl goto :EOFerfordert aktivierte Befehlserweiterungen, um die Batchdateiverarbeitung wirklich zu beenden. Weitere Informationen finden Sie unter Wohin kehrt GOTO: EOF zurück?

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie dort die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

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

Siehe auch:


1
Das ist eine unglaubliche Antwort. Ich benutze ab sofort nur noch Choice.exe.
Bas

choice.exe gab es seit 6.0 auch in DOS
Brian Minton

@ BrianMinton Das ist nicht richtig. Die 16-Bit-Anwendung war CHOICE.COMstandardmäßig unter MS-DOS 6.0, MS-DOS 7.0, Windows 95 und Windows 98 verfügbar. Unter choice.exeWindows NT4, Windows 2000 und Windows XP war sie jedoch standardmäßig nicht installiert. CHOICE.COMkönnte auch unter NT4, Windows 2000 und Windows XP verwendet werden, es wäre jedoch besser, 32-Bit choice.exeaus dem entsprechenden Ressourcen-Kit zu verwenden. Siehe Rob van der Woudes Seite über WAHL . Die Optionen unterscheiden sich teilweise zwischen CHOICE.COMund choice.exe. Die Frage bezieht sich jedoch nicht auf DOS.
Mofi

@mofi danke für die Info.
Brian Minton

5

Hier etwas einfacher:

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

oder

@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

Nach dem Y geben Sie den Befehl ein, den Sie ausführen möchten. Dafür sind die ... da :)
Bob Smith

Ich meinte: %errorlevel%ist immer ein ganzzahliger Wert. Siehe hier für die Dokumentation einschließlich eines Beispiels.
Stephan

1

Hier ist meine Methode für eine Ja / Nein- Antwort.

Es wird auch nicht zwischen Groß- und Kleinschreibung unterschieden.

Dies prüft nur auf die durch die Eingabe angegebenen Fehler und setzt die choiceVariable auf das, was Sie benötigen, damit sie unten im Code verwendet werden kann.

@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

Wenn Sie möchten, dass das Stapelverarbeitungsprogramm zur Eingabeaufforderung zurückkehrt und die Eingabeaufforderung (AKA cmd.exe) nicht schließt, können Sie "exit / b" verwenden.

Dies kann helfen.

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

Oder wenn Sie nicht so viele Zeilen verwenden möchten ...

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

Hoffe das hilft...


0

Hier ist ein einfaches Beispiel, das ich in einem Sicherungsskript (.bat / batch) unter Windows 10 verwende, mit dem ich beim Erstellen von Sicherungen verschiedene Optionen haben kann.

...

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

...

Sie können so viele dieser Blöcke haben, wie Sie benötigen.


0

Öffnen Sie zuerst das Terminal.

Geben Sie dann ein

cd ~
touch .sure
chmod 700 .sure

Öffnen Sie anschließend .sure und fügen Sie diese ein.

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

Schließen Sie danach die Datei.

~/.sure ; ENTER COMMAND HERE

Dies gibt Ihnen eine Aufforderung, ob Sie sicher sind, bevor Sie den Befehl fortsetzen.


Vielleicht in Bash, aber sicher nicht in Batch.
Stephan

Oh. Ich denke nicht. Es funktioniert nur für Terminalbefehle, nicht für Stapelbefehle. Entschuldigung für die falschen Informationen.
user13636521

-1

Terminal öffnen. Geben Sie Folgendes ein

echo>sure.sh
chmod 700 sure.sh

Fügen Sie dies sicher ein

#!\bin\bash

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

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

exit 0

Schließen Sie sure.sh und geben Sie dies in Terminal ein.

alias sure='~/sure&&'

Wenn Sie nun vor der Eingabe des Befehls sicher eingeben, erhalten Sie eine Aufforderung zur Gewissheit, bevor Sie den Befehl fortsetzen.

Hoffe das ist hilfreich!


Vielleicht in Bash, aber sicher nicht in Batch.
Stephan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.