wake-up-neo.com

Wie kann ich in einer Windows-Batchdatei eine Aufforderung "Bist du sicher?"

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 so viel wie es mir hilft, diesen Befehl aus meinem Befehlspuffer zu wählen und unbeabsichtigte Änderungen zu überschreiben. 

Welchen Code würde ich für meine .bat-Datei benötigen, damit er sagt, "sind Sie sicher?" Und Sie "y" eingeben, bevor der Rest der Datei ausgeführt wird? Wenn etwas außer "y" eingegeben wird, sollte die Ausführung in dieser Zeile beendet werden.

Edit 27. November. Ok. Ich habe dies erneut als unbeantwortet markiert, da ich es immer noch nicht herausfinden kann. Wenn ich "exit" anrufe es schließt cmd.exe, was ich nicht will. All dies, weil Windows den Befehlspuffer falsch implementiert hat (anders als ich es gewohnt bin)

67
Josh Ribakoff

Sie wollen 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
127
Joe

versuchen Sie den Befehl CHOICE , z.

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

Der Befehl choice ist nicht überall verfügbar. Bei neueren Windows-Versionen hat der Befehl set die Option /p, mit der Sie Benutzereingaben erhalten können

SET /P variable=[promptString]

siehe set /? für weitere Informationen

11
ghostdog74

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

  • set mit der Option /P verfügbar auf allen Windows NT-Versionen mit aktivierten Befehlserweiterungen und
  • choice.exe ist standardmäßig unter Windows Vista und höheren Windows-Versionen für PC-Benutzer sowie unter Windows Server 2003 und höheren Serverversionen von Windows verfügbar.

set 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), die sich in %SystemRoot%\System32 befindet. choice.exe von Windows Server 2003 kann in das Verzeichnis %SystemRoot%\System32 auf einem Windows-Computer XP kopiert werden, um unter Windows XP verwendet zu werden, wie viele andere Befehle, die standardmäßig unter Windows XP, aber standardmäßig unter Windows Server 2003 verfügbar sind.

Es ist aus den folgenden Gründen empfehlenswert, die Verwendung von CHOICE der Verwendung von SET/P vorzuziehen:

  1. CHOICE akzeptiert nur Schlüssel (bzw. Zeichen, die aus STDIN) gelesen wurden, die nach der Option /C (und angegeben wurden Ctrl+C) und gibt einen Fehlerton aus, wenn der Benutzer eine falsche Taste drückt.
  2. CHOICE benötigt keine andere Taste als eine der zulässigen. CHOICE wird sofort beendet, sobald eine akzeptable Taste gedrückt wird, während SET/P erfordert, dass der Benutzer die Eingabe mit beendet RETURN oder ENTER.
  3. Mit CHOICE können Sie eine Standardoption und eine Zeitüberschreitung 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 von einer anderen Batch-Datei beantwortet wird, die die Batch-Datei mit der Eingabeaufforderung aufruft, und zwar mit etwas wie echo Y | call PromptExample.bat bei Verwendung von CHOICE.
  5. Die Bewertung der Benutzerauswahl ist mit CHOICE viel einfacher, da CHOICE mit einem Wert gemäß gedrückter Taste beendet wird (Zeichen), das der FEHLEREBENE zugeordnet ist, die als nächstes leicht ausgewertet werden kann.
  6. Die Umgebungsvariable, die für SET/P verwendet wird, ist nicht definiert, wenn der Benutzer nur die Taste drückt RETURN oder ENTER und es 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 RETURN oder ENTER.
  7. Der Benutzer hat die Freiheit, bei Aufforderung mit SET/P irgendetwas einzugeben, einschließlich einer Zeichenfolge, die später aufgrund eines Syntaxfehlers zu einem Beenden der Batchdatei-Ausführung durch cmd führt, oder in Ausführung von Befehlen, die überhaupt nicht in der Batch-Datei enthalten sind, in einer nicht gut codierten Batch-Datei. Es bedarf einiger Anstrengungen, um SET/P gegen versehentliche oder absichtlich falsche Benutzereingaben abzusichern.

Hier ist ein Beispiel für eine Eingabeaufforderung, in dem bevorzugte AUSWAHL und alternativ SET/P für choice.exe verwendet werden. Diese Option ist auf verwendeten Computern unter Windows nicht verfügbar.

@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 Batch-Datei verwendet Befehlserweiterungen, die unter Windows 95/98/ME nicht verfügbar sind, und verwendet command.com anstelle von cmd.exe als Befehlsinterpreter.

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

echo Y | call PromptExample.bat ergibt YSPACE Wird der Umgebungsvariablen UserChoice zugewiesen. Das würde dazu führen, dass die Eingabeaufforderung zweimal verarbeitet wird, da "Y " weder "N" noch "Y" ohne vorherige Löschung aller Leerzeichen zwischen Groß- und Kleinschreibung gleich ist. Also UserChoice mit YSPACE as value würde dazu führen, dass die Eingabeaufforderung ein zweites Mal mit der Option N ausgeführt wird, wie in der Batchdatei bei der zweiten Ausführung der Eingabeaufforderung als Standard definiert, was zum unerwarteten Beenden der Batchdateiverarbeitung führt. 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 am Wie kann der Windows-Befehlsinterpreter daran gehindert werden, die Batchdatei-Ausführung bei einer falschen Benutzereingabe zu beenden?

Noch ein paar Hinweise:

  1. IF vergleicht die beiden Zeichenfolgen links und rechts des Vergleichsoperators mit einschließlich der doppelten Anführungszeichen. Bei einem Vergleich zwischen Groß- und Kleinschreibung wird also nicht der Wert von UserChoice mit N und Y verglichen, sondern der Wert von UserChoice, umgeben von " mit "N" und "Y".
  2. Die Vergleichsoperatoren IFEQU und NEQ dienen hauptsächlich zum Vergleichen von zwei Ganzzahlen im Bereich -2147483648 bis 2147483647 und nicht zum Vergleichen von zwei Zeichenfolgen. EQU und NEQ funktionieren auch für Zeichenfolgenvergleiche, ergeben jedoch beim Vergleich von Zeichenfolgen in doppelten Anführungszeichen einen sinnlosen Versuch, die linke Zeichenfolge in eine Ganzzahl umzuwandeln. EQU und NEQ können nur mit aktivierten Befehlserweiterungen verwendet werden. Die Vergleichsoperatoren für Zeichenfolgenvergleiche sind == und not ... ==, die auch mit deaktivierten Befehlserweiterungen funktionieren, da sogar command.com von MS-DOS und Windows 95/98/ME diese bereits unterstützt. Weitere Informationen zu IF Vergleichsoperatoren finden Sie unter Symbol entspricht NEQ, LSS, GTR usw. in Windows-Batchdateien .
  3. Der Befehl goto :EOF erfordert aktivierte Befehlserweiterungen, um die Batch-Dateiverarbeitung wirklich zu beenden. Weitere Informationen finden Sie unter Wohin kehrt GOTO: EOF zurück?

Um zu verstehen, welche Befehle verwendet werden und wie sie funktionieren, ö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:

4
Mofi

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%== Y goto ...
if %errorlevel%== N exit
2
Bob Smith

Hier ist ein einfaches Beispiel, das ich in einem Backup-Skript (.bat/batch) unter Windows 10 verwende, das mir bei der Erstellung von Backups verschiedene Optionen bietet.

...

: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/ [email protected]:/home/user/Backup/blabla/"
echo done

:doonotsyncthefiles
echo Backup Complete!

...

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

0
GWS One

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

Das 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
Z. Mickaels