keiosid
Goto Top

Eine Ja Nein Abfrage in ein Batchdatei integrieren

Hallo,

ich möchte mit einer Batchdatei bestimmte Dateien auf verschiedene Server kopieren.

Das Skript zum kopieren, umbenennen, löschen und verschieben der Dateien ist kein Problem.

Allerdings möchte ich nach dem Start des Skripts noch einmal eine Abfrage einbauen, ob der User das tatsächlich machen will.

Die Abfrage sollte etwa so ausseheh:

"Sind Sie sicher, dass Sie die Dateien auf den live-Servern austauschen wollen? (J/N)"


Ist das möglich?

Danke
Grüße
KeiosID

Content-Key: 118820

Url: https://administrator.de/contentid/118820

Printed on: April 16, 2024 at 12:04 o'clock

Member: derschakal83
derschakal83 Jun 23, 2009 at 08:05:37 (UTC)
Goto Top
Hallo,

probier mal das hier:

@echo OFF
ECHO moechten Sie das wirklich tun? (j / n)
SET /p wahl=
if '%wahl%' == 'n' goto Nein
if '%wahl%' == 'j' goto Ja
Goto Ende
:Nein
echo Sie haben NEIN gedrueckt
goto Ende
:Ja
echo Sie haben JA gedrueckt
:Ende
pause


Gruß Tobias
Member: KeiosID
KeiosID Jun 23, 2009 at 08:29:06 (UTC)
Goto Top
Danke,

sieht gut aus und funktioniert.

Grüße

KeiosID
Mitglied: 77559
77559 Jun 23, 2009 at 09:02:23 (UTC)
Goto Top
Hallo Tobias,

eine gute Antwort, mit einer if /i Abfrage wäre es zusätzlich von der Groß-/Kleinschreibung unabhängig.
Bitte markiere Code mit den entsprechenden Tags. Siehe in der Formatierungshilfe

Eine etwas effizientere Methode um ggfs auch noch mehr Verzweigungen mit einer vorgegebenen Antwort zu erhalten ist
@ECHO OFF
ECHO moechten Sie das wirklich tun? (j / n)
SET /p wahl=
For %%A in (J N) Do if /i '%wahl%'=='%%A' goto :Wahl%%A  
Echo Ungueltige Antwort&Pause&Exit /B 1
Goto Ende
:WahlN
echo Sie haben NEIN gedrueckt
goto Ende
:WahlJ
echo Sie haben JA gedrueckt
:Ende
pause

Gruß
Member: pieh-ejdsch
pieh-ejdsch Jun 23, 2009 at 09:10:44 (UTC)
Goto Top
@ @derschakal83

auweia!!!

was ist wenn gar nix oder anderes gedrückt wird?
oder Großbuchstaben?
...dann läuf die batch Trotzdem weiter! (goto Ende)
Der Anwender denkt dann ja alles OK wurde gemacht oder halt nicht gemacht.
Ohne diese Meldung steht der Anwender in der Suppe!

Würde ich grundlegend so bewerkstelligen!

@ECHO OFF
ECHO moechten Sie das wirklich tun? (j / n)
:Frage
SET /p wahl=
if /i not '%wahl%' == 'n' (if /i '%wahl%' == 'j' (goto Ja ) ) else goto Nein   
if defined wahl ECHO Bitte fangen sie keine Unterhaltung an!
ECHO Antworten Sie Bitte nur mit   j  für Ja oder n für Nein. & goto Frage
:Nein
echo Sie haben NEIN gedrueckt
goto Ende
:Ja
echo Sie haben JA gedrueckt
:Ende
pause

Gruß Phil

[Edit] mist - zu spät [/Edit]
@@77559

wieso dann bei Dir :
Zeile 06. Goto Ende
Zeile 12. :Ende
??????
kannste weglassen
Member: derschakal83
derschakal83 Jun 23, 2009 at 10:13:26 (UTC)
Goto Top
@ phil:
warum denn gleich so arrogant? ("auweia!!!")

Die Aufgabe die er an das Programm gestellt hat, würde genau erfüllt. Außerdem läuft das Programm nicht weiter, falls man eine Taste drückt - sondern springt zum Ende und wird einfach beendet ("Goto Ende" hinter dem IF)

Er scheint ja außerdem das Programm für sich selbst zu entwickeln, ich behaupte mal da braucht man nicht unbedingt auf "Super-DAU"-freundliche Lösung.

Trotzdem danke für die Verbesserungsvorschläge an euch beide.
Mitglied: 77559
77559 Jun 23, 2009 at 10:26:03 (UTC)
Goto Top
Zitat von @pieh-ejdsch:
@@77559
wieso dann bei Dir :
Zeile 06. Goto Ende
> Zeile 12. :Ende
??????
kannste weglassen

Da ist eine pause in 13 damit man die Meldung auch lesen kann.
Ansonsten hätte ich gleich Goto :eof genommen.

Aber Du hast trotzdem Recht, aber aus einem anderen Grund: Zeile 06 wird durch den Exit am Ende von Zeile 05 niemals erreicht.
Das kommt wenn nachträglich im Code rumpfuscht face-wink

Gruß
LotPings
Member: KeiosID
KeiosID Jun 23, 2009 at 11:05:18 (UTC)
Goto Top
Hi Leute,

vielen Dank für die weiteren ANregungen und Hilfen. Diese werden nun auch noch miteingearbeitet.

In der Tat wäre es blöd, wenn die files unbeabsichtigt verteilt werden würden. Das käme unter Umständen einem Supergau gleich...

Grüße vom Batchnoob, der trotzdem Batch zusammenfrickelt.
KeiosID

PS.: Wenn ich das script fertig habe, stelle ich es mal ein
Member: KeiosID
KeiosID Jun 23, 2009 at 13:55:59 (UTC)
Goto Top
so, hier noch das fertige Werk

@echo off
rem Abfrage ob Dateien wirklich verschoben werden sollen.
:Frage
echo Moechten Sie wirklich die Runtimedatei auf allen Live-Servern verteilen? (J N)
set /p wahl=
for %%A in (J N) Do if /i '%wahl%'=='%%A' goto Wahl%%A  
ECHO Ungueltige Antwort, nur (J N) & goto Frage
:WahlN
echo Sie haben Nein gedrueckt
goto Ende

:WahlJ
rem Überprüfen ob die neuste Exportdatei bereits umbenannt wurde, wenn nicht, dann wird die Umbenennundverschiebe.bat 
rem für die TEstumgebung aufgerufen

if exist "\\server0019\shares2\vhv\it_abteilung\Editor_Development\Editor\Server\wd_adware_abo_07\export\exported_configurations\runtime.dux" (  
	call "\\server0019\shares2\vhv\it_abteilung\Editor_Development\Editor\Server\wd_adware_abo_07\export\exported_configurations\UmbenennUndVerschiebenachTestLokal.bat"  
	echo UmbenennUndVerschiebenachTestLokal.bat abgearbeitet
	)
rem Datum als Zahl ermitteln(Format MMTTJJJJ)

For /F "tokens=1-7 delims=:/.- " %%a in ("%date%") do set KDATE=%%b%%a%%c  
rem Zeit als Zahl ermitteln(Format MMSS)
For /F "tokens=1-2 delims=:/.-, " %%a in ("%time%") do set KTIME=%%a%%b  
rem Timestamp erzeugen
set TIMESTAMP=%KDATE%%KTIME%

rem Verschieben umbenennen der Dateien auf den Servern in das Altverzeichnis und Kopieren der neuen Datei
rem Testserver
move \\server00ss\Editor\Server\Export\exported_configurations\adware_abo_07.dux \\server00ss\Editor\Server\Export\exported_configurations\alte_dux_dateien\
ren \\server00ss\Editor\Server\Export\exported_configurations\alte_dux_dateien\adware_abo_07.dux %TIMESTAMP%adware_abo_07.dux
copy \\server0019\shares2\vhv\it_abteilung\Editor_Development\Editor\Server\wd_adware_abo_07\export\exported_configurations\adware_abo_07.dux \\server00ss\Editor\Server\Export\exported_configurations\
echo adware_abo_07.dux wurde auf server00ss kopiert
rem server0044
move \\server0044\Editor\Server\Export\exported_configurations\adware_abo_07.dux \\server0044\Editor\Server\Export\exported_configurations\alte_dux_dateien\
ren \\server0044\Editor\Server\Export\exported_configurations\alte_dux_dateien\adware_abo_07.dux %TIMESTAMP%adware_abo_07.dux
copy \\server0019\shares2\vhv\it_abteilung\Editor_Development\Editor\Server\wd_adware_abo_07\export\exported_configurations\adware_abo_07.dux \\server0044\Editor\Server\Export\exported_configurations\
echo adware_abo_07.dux wurde auf server0044 kopiert
rem server0043
move \\server0043\Editor\Server\Export\exported_configurations\adware_abo_07.dux \\server0043\Editor\Server\Export\exported_configurations\alte_dux_dateien\
ren \\server0043\Editor\Server\Export\exported_configurations\alte_dux_dateien\adware_abo_07.dux %TIMESTAMP%adware_abo_07.dux
copy \\server0019\shares2\vhv\it_abteilung\Editor_Development\Editor\Server\wd_adware_abo_07\export\exported_configurations\adware_abo_07.dux \\server0043\Editor\Server\Export\exported_configurations\
echo adware_abo_07.dux wurde auf server0043 kopiert

echo. 
echo Sie haben nun die Dateien auf den Servern Verteilt.
echo.
echo Bitte starten Sie die Server server00ss, server0043 und server0044 neu
:Ende
pause
exit
Mitglied: 77559
77559 Jun 23, 2009 at 14:26:26 (UTC)
Goto Top
Hallo KeiosID,

lange Pfade würde ich immer in Anführungszeichen setzen und ich würde um Redundanz zu vermeiden und die Batchdatei lesbarer zu machen Schleifen benutzen und lange (gleiche) Pfade/-bestandtteile aus Variablen lesen.
Dies sollte von der Funktion identisch sein ( natürlichungetestet)
@echo off
rem Abfrage ob Dateien wirklich verschoben werden sollen.
:Frage
echo Moechten Sie wirklich die Runtimedatei auf allen Live-Servern verteilen? (J N)
set /p wahl=
for %%A in (J N) Do if /i '%wahl%'=='%%A' goto Wahl%%A  
ECHO Ungueltige Antwort, nur (J N) & goto Frage
:WahlN
echo Sie haben Nein gedrueckt
goto Ende

:WahlJ
rem Überprüfen ob die neuste Exportdatei bereits umbenannt wurde, wenn nicht, dann wird die Umbenennundverschiebe.bat 
rem für die TEstumgebung aufgerufen
set s19exconf=\\server0019\shares2\vhv\it_abteilung\Editor_Development\Editor\Server\wd_adware_abo_07\export\exported_configurations
set Editor\Server\Export\exported_configurations
if exist "%s19exconf%\runtime.dux" (  
  call "%s19exconf%\UmbenennUndVerschiebenachTestLokal.bat"  
  echo UmbenennUndVerschiebenachTestLokal.bat abgearbeitet
)
rem Datum als Zahl ermitteln(Format MMTTJJJJ)

For /F "tokens=1-7 delims=:/.- " %%a in ("%date%") do set KDATE=%%b%%a%%c  
rem Zeit als Zahl ermitteln(Format MMSS)
For /F "tokens=1-2 delims=:/.-, " %%a in ("%time%") do set KTIME=%%a%%b  
rem Timestamp erzeugen
set TIMESTAMP=%KDATE%%KTIME%

rem Verschieben umbenennen der Dateien auf den Servern in das Altverzeichnis und Kopieren der neuen Datei
rem Testserver
For %%A in (server00ss server0044 server0043) DO (
  move "\\%%A\%edconf%\adware_abo_07.dux" "\\%%A\%edconf%\alte_dux_dateien\%TIMESTAMP%adware_abo_07.dux"  
  copy "%s19exconf%\adware_abo_07.dux" "\\%%A\%edconf%\"  
  echo adware_abo_07.dux wurde auf %%A kopiert
)
echo. 
echo Sie haben nun die Dateien auf den Servern Verteilt.
echo.
echo Bitte starten Sie die Server server00ss, server0043 und server0044 neu
:Ende
pause
exit

Gruß
Member: KeiosID
KeiosID Jun 26, 2009 at 09:24:06 (UTC)
Goto Top
Hallo LotPing,

die Lösung mit den Variablen und vorallem mit der ForSchleife gefällt mir sehr gut,
auch in der Richtung hin, dass ich das Script noch für ca. 10 weitere Files anpassen mus.

Allerdings funktioniert bei mir die For Schleife nicht richtig, kannst Du hier einen Fehler erkennen?

for /D %%B in (sedemune00ss sedemune0044 sedemune0043) do(
		move "\\%%B\%sspfadexp%\adware_abo_07.dux" "\\%%B\%sspfadexp%\alte_dux_dateien\"  
		echo pause 2
		pause
		ren "\\%%B\%sspfadexp%\alte_dux_dateien\adware_abo_07.dux" "%TIMESTAMP%_adware_abo_07.dux"  
		copy "\\%s19exconf%\adware_abo_07.dux" "\\%%B\%sspfadexp%\"  
		echo adware_abo_07.dux wurde auf %%B kopiert
	)

Grüße

KeiosID
Mitglied: 77559
77559 Jun 26, 2009 at 10:27:41 (UTC)
Goto Top
Hallo KeiosID,

Das /D gehört da nicht hin, dies ist die einfache Form des For-Befehl.
Das Verschieben und dann umbenennen macht IMO keinen Sinn, das geht in einem Schritt.

Hier mal eine andere Formatierung und copy nur wenn move erfolgreich war (ungetestet)
for %%B in (
sedemune00ss
sedemune0044
sedemune0043
) do move "\\%%B\%sspfadexp%\adware_abo_07.dux" "\\%%B\%sspfadexp%\alte_dux_dateien\%TIMESTAMP%_adware_abo_07.dux" &&(copy "\\%s19exconf%\adware_abo_07.dux" "\\%%B\%sspfadexp%\" &	echo adware_abo_07.dux wurde auf %%B kopiert)  

Gruß
Member: KeiosID
KeiosID Jun 26, 2009 at 12:31:24 (UTC)
Goto Top
Hallo LotPings,
danke für die Hilfe, nun arbeitet es auch.

Nun noch ein paar Fragen zum Verständniss
for %%B in (
sedemune00ss 
sedemune0044
sedemune0043 
)

Müssen hier die Werte untereinander angeordnet sein?


Und bei dem Part mit "do", müssen hier die verschiedenen Aufgaben mit && und & verknüpft sein? Darf man das nicht in einer Klammer zusammenfassen?

Danke

Grüße
KeiosID
Mitglied: 77559
77559 Jun 26, 2009 at 12:41:40 (UTC)
Goto Top
Das kann man genausogut hintereinande schreiben.
Ich "schrub" doch eine andere (alternative) Formatierung.

Das && bedeutet das der folgende Bereich in Klammern nur ausgeführt wird wenn der Move erfolgreich war.
Hinter öffnenden oder vor schließenden Klammern kann man immer in eine neue Zeile wechseln ohne das die Logik hiervon beeinflusst wird.

Diese Version ist von der Funktion her absolut identisch.
for %%B in (sedemune00ss sedemune0044 sedemune0043
) do move "\\%%B\%sspfadexp%\adware_abo_07.dux" "\\%%B\%sspfadexp%\alte_dux_dateien\%TIMESTAMP%_adware_abo_07.dux" &&(  
  copy "\\%s19exconf%\adware_abo_07.dux" "\\%%B\%sspfadexp%\"  
  echo adware_abo_07.dux wurde auf %%B kopiert
)

Gurß
LotPings
Member: pbelcl
pbelcl Dec 12, 2010 at 12:25:03 (UTC)
Goto Top
Hi Leute,

Danke für diesen Beitrag, er hat mir sehr geholfen!
Abschliessend eine Frage dazu:

Gibt es auch eine Möglichkeit diese Frage einzubauen OHNE sie mit einem ENTER bestätigen zu müssen?
Eventuell auch über ein Zusatztool??

das wär dann nicht nur perfekt, sondern GENIAL face-wink
Mitglied: 77559
77559 Dec 13, 2010 at 07:39:40 (UTC)
Goto Top
Hallo pbelcl,
Microsoft'scher Unentschlossenheit ist es zu verdanken,
das nicht ALLE DOS-/Windows-Versionen den für dein Vorhaben geeigneten CHOICE Befehl kennen.

Eine Alternative ist Choose von Bill Stewart das es als Real-Mode Dos und in 32/64 Bit Versionen für Windows gibt.

Gruß
Lotpings
Member: Biber
Biber Dec 13, 2010 at 08:12:39 (UTC)
Goto Top
Moin pbelcl,

ergänzend zu LotPings' Aussage und Hinweis:

Ja, stimmt, die Redmonder Hobbycoder haben das CHOICE-Utility irgendwann mal weggelassen.

Allerdings in diesem Fall IMHO zu Recht.
Es ist seit ein paar Jahren wirklich nicht mehr hip oder trendy irgendwo die Logik einzubauen
"Wenn der Benutzer nicht innerhalb von 3 Sec den Nein-Button drückt, dann drücke ich für ihn den Ja-Button".

Das machen vielleicht noch einige Dialer oder Klingelton-an-Kiddies-Verticker... aber es braucht auch wirklich sonst kein Mensch.

Lass es einfach weg... auch wenn ich sonst durchaus Bill Stewarts Site empfehlen kann.

Grüße
Biber
Member: pbelcl
pbelcl Dec 13, 2010 at 17:42:16 (UTC)
Goto Top
Danke für die beiden Tipps!

Ist eh richtig denn der Spruch:
Zitat von @Biber:
"Wenn der Benutzer nicht innerhalb von 3 Sec den Nein-Button drückt, dann drücke ich für ihn den
Ja-Button"
.
hat mich nicht nur zum Lachen gebracht, sondern ist auch wahr !

Ich werd mal überlegen ob mein Perfektionismus das aushalten kann face-wink
Wenn nicht, dann werd ich mal bei Bill Steward vorbeischauen...
Mitglied: 77559
77559 Dec 14, 2010 at 11:45:59 (UTC)
Goto Top
Hallo Biber,

der Wunsch ging ja eher in Richtung "kein Enter",
den Timeout mit Default muss man ja nicht benutzen.

Gruß
LotPings
Member: Biber
Biber Dec 14, 2010 at 12:19:14 (UTC)
Goto Top
Moin LotPinx,

ja, da habe ich zu flüchtig gelesen.
Pavlovscher Reflex... immer, wenn eine/r CHOICE.com ausgräbt, dann klickert es bei mir in Richtung "Default nach 3 Sek".

Also das ENTER einsparen will er...?

Dazu im Batch in das SET /P-Feld einfach 2087 Zeichen eingeben.. dann geht es ohne ENTER weiter.

Solche verwöhnte Konsumküken... früher haben wir Bätsche noch auf dem Lochkartenstanzer getippt... face-wink

Grüße
Biber
Member: MrComp
MrComp Feb 13, 2016 at 14:38:05 (UTC)
Goto Top
Kann man das auch so programmieren, dass man nur die Taste drücken muss?
Wäre nämlich sehr nützlich, vor allem wenn man das nur drücken müsse, anstatt dass man das eingeben und dann Enter drücken, außerdem kann man sich so nicht mit Groß- und Kleinschreibung vertun

LG Comp
Mitglied: 126919
126919 Feb 13, 2016 updated at 14:51:59 (UTC)
Goto Top
@MrComp
choice /c jn /M "Ihre Antwort"  
if errorlevel 1 (
    echo Ja
) else (
    echo Nein
)

oder
set /p answer=Ihre Antwort [j/n]
if /i "%answer%" == "j" (  
    echo Ja
) else (
    echo Nein
)

Beides gleichermassen case "insensitive"

außerdem kann man sich so nicht mit Groß- und Kleinschreibung vertun
Bei einem IF mit Parameter /i ist das wurst...

fk
Member: RycoDePsyco
RycoDePsyco Apr 26, 2017 at 14:28:34 (UTC)
Goto Top
Vielen Dank für die letzten Scrips, die haben sehr geholfen.

Eine Frage hätte ich, wie kann zum Text "Ihre Antwort" ein Zeilenumbruch eingefügt werden?
Gibt es da ein Befehl?

...
Ihre
Antwort [J/N]
...

Vielen Dank für die Hilfe.
Mitglied: 77559
77559 Apr 29, 2017 at 21:11:48 (UTC)
Goto Top
Eine Frage hätte ich, wie kann zum Text "Ihre Antwort" ein Zeilenumbruch eingefügt werden?
Der Sinn von set /p ist ja gerade keinen Zeilenwechsel zu erzeugen.
Es wird deshalb ja auch häufig miss-/gebraucht.
Einfach ein Echo mit dem Prompt-Text voranstellen und hinter dem Gleich-Zeichen leer lassen bzw. bei choice kein /M setzen.