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)
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
versuchen Sie den Befehl CHOICE , z.
CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
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
Für Benutzeraufforderungen in der Windows-Befehlszeile stehen zwei Befehle zur Verfügung:
/P
verfügbar auf allen Windows NT-Versionen mit aktivierten Befehlserweiterungen und 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:
/C
(und angegeben wurden Ctrl+C) und gibt einen Fehlerton aus, wenn der Benutzer eine falsche Taste drückt.echo Y | call PromptExample.bat
bei Verwendung von CHOICE.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:
UserChoice
mit N
und Y
verglichen, sondern der Wert von UserChoice
, umgeben von "
mit "N"
und "Y"
.EQU
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 .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:
set "variable=value"
beim Zuweisen einer Zeichenfolge zu einer Umgebungsvariablen.if errorlevel X
und zum Operator &
.|
und des Handles STDIN.SystemRoot
.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
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.
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...