kkboy94
Goto Top

Richtige If not-Überprüfung

Hallo Leute,

ein nächste Problem tut sich mir in meiner Batch-programmierung auf.
Ich poste einfach mal den betreffenden Code-Abschnitt
:restart1
echo Sie haben eine falsche Auswahl getroffen. 
echo Bitte die Auswahl wiederholen.
echo.
:cont
echo Auf Gro%ss%-/Kleinschreibung achten!
set /p question1=Sollen der Key und die Profile gesichert werden?(Ja/Nein):  
if %question1%==Ja goto backup 
if %question1%==Nein echo Sie haben %question1% gew%ae%hlt.
if not %question1%==Ja goto restart1
if not %question1%==Nein goto restart1
goto backupelse

Das Problem ist jetzt folgendes. Wenn ich nun "Nein" eingebe (was an sich eigentlich richtig ist), sagt mir die Batch, dass die Auswhal falsch getroffen ist. Ich habe auch schon geprüft ob ich etwas in dem Programmcode an der Rechtschreibung falsch gemacht hab, aber dem war nicht so.

Vielleicht gibt es ja auch noch andere Wege, die Auswahl wiederholen zu lassen, wenn die Eingabe mit keiner der beiden Möglichkeiten übereinstimmt.
Ich hoffe ihr könnt mir helfen.

MfG Karsten

Content-Key: 144711

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

Printed on: May 26, 2024 at 06:05 o'clock

Member: bastla
bastla Jun 12, 2010 at 14:24:02 (UTC)
Goto Top
Hallo kkboy94!

Warum willst Du Deine Benutzer zu einer Eingabe "Nein" zwingen? Zumeist wird es genügen, festzustellen, ob überhaupt etwas eingegeben wurde (um ein irrtümliches Enter abzufangen) und falls ja, ob sich daraus ein "Ja" ableiten lässt - also etwa:
:restart
set "question1="  
set /p question1=Sollen der Key und die Profile gesichert werden?(Ja/Nein): 
if not defined question1 goto :restart
if /i %question1:~,1%==J goto :backup
echo Na gut, dann nicht ...
goto :eof

:backup
Grüße
bastla
Member: kkboy94
kkboy94 Jun 12, 2010 at 14:38:59 (UTC)
Goto Top
Danke für die Anregung
Auf die Idee bin ich noch nicht gekommen


if /i %question1:~,1%==J goto :backup 
Was bedeutet das "~,1%"?

Da ist noch etwas was mich verwirrt:
if not defined question1 goto :restart 
Muss das question1 nicht als Variable mit % angegeben werden?
if not defined %question1% goto :restart 

und das "goto :eof" kann ich dann durch meine eigen Sprungmarke ersetzen?


Dank nochmal

MfG Karsten
Member: bastla
bastla Jun 12, 2010 at 15:07:43 (UTC)
Goto Top
Hallo kkboy!
Was bedeutet das "~,1%"?
Entspricht der Vorgangsweise im anderen Thread - außerdem lässt sich das durch ein
echo %question1:~,1%
relativ leicht nachvollziehen ...
Muss das question1 nicht als Variable mit % angegeben werden?
Gegenfrage: Kannst Du Dir einen vernünftigen Grund vorstellen, warum ich die Prozentzeichen dann nicht gesetzt hätte? Abgesehen davon: Was hat Dein diesbezüglicher Test ergeben (Du hast es doch sicher schon versucht)?
und das "goto :eof" kann ich dann durch meine eigen Sprungmarke ersetzen?
Völlig richtig (wenn Du es beibehieltest, würde der Batch beendet).

Grüße
bastla
Member: kkboy94
kkboy94 Jun 12, 2010 at 19:57:21 (UTC)
Goto Top
Funktioniert alles wunderbar. Wenn man dich nicht hätte.....
Vielen Dank bastla

> Muss das question1 nicht als Variable mit % angegeben werden?
Gegenfrage: Kannst Du Dir einen vernünftigen Grund vorstellen, warum ich die Prozentzeichen dann nicht gesetzt hätte?
Abgesehen davon: Was hat Dein diesbezüglicher Test ergeben (Du hast es doch sicher schon versucht)?

Jap ich habs schon versucht, und wenn ich da Prozentzeichen hin gesetzt habe, ging er sofort zur Sprungmarke. Ist das einfach so, oder gibs da eine Begründung für? Aus reinem Interesse frag das jetzt mal.


PS: Ich wollt jetzt nicht unbedingt einen neuen Thread aufmachen, und außerdem gehörts auch ein wenig zum Thema dazu also hier meine nächste Frage:

Ich habe jetzt in meiner Batch zwei solcher Fragen. Nun hätte ich gerne Nach Abfrage dieser Fragen, eine Überprüfung, ob beide Fragen mit Nein beantwortet wurden, Wenn dies der Fall ist, soll halt eine bestimmte Ausgabe angezeigt werden. Soweit mein Versuch
if %question1%==Nein (
 if %question2%==Nein (
echo Sie haben keine der beiden Aktionen gewaehlt.
echo Das Programm wird nun geschlossen.
ping localhost -n 5 >nul
exit
)
)
echo Beliebige Taste zum Beenden druecken.
pause >nul
exit
Member: bastla
bastla Jun 12, 2010 at 22:32:32 (UTC)
Goto Top
Hallo kkboy!
Ist das einfach so, oder gibs da eine Begründung für? Aus reinem Interesse frag das jetzt mal.
Ja face-wink - aus der Hilfe zu "if":
Die Bedingung DEFINED arbeitet genau wie EXIST, bezieht sich aber auf
den Namen einer Umgebungsvariablen und ist wahr, wenn die Umgebungs-
variable definiert ist.
Es ist also nicht die Variable (mit Prozentzeichen), sondern der Name der Variablen anzugeben ...
An sich spricht nicht viel gegen Deine beiden "if" (die Klammer nach dem ersten ist allerdings nicht nötig, und das "exit" - wenn es, wie hier, nicht dazu dient, per "/b" einen Errorlevel zurückzuliefern - würde ich durch ein "goto :eof" ersetzen).

Falls ohnehin nur eine der beiden abgefragten Aktionen ausgeführt werden könnte, böte sich auch "goto" an - schematisch etwa so:
set /p question=Aktion1?
if /i %question:~,1%==J goto :Aktion1

set /p question=Aktion2?
if /i %question:~,1%==J goto :Aktion2

echo Na dann nicht ...
pause
goto :eof

:Aktion1
echo Aktion1 erledigt.
pause
goto :eof

:Aktion2
echo Aktion2 erledigt.
pause
goto :eof
Weitere Alternative: Eine (Schalter-)Variable %Done% vorweg löschen und bei Ausführung einer Aktion mit einem (beliebigen) Wert versehen
set "Done="
...
...
echo Aktion 1 wird ausgefuehrt
set "Done=True"
...
...
echo Aktion 2 wird ausgefuehrt
set "Done=True"
...
...
Am Ende kann dann per
if not defined Done echo Keine Aktion gewaehlt
pause
goto :eof
kontrolliert werden, ob der Schalter zumindest durch eine Aktion gesetzt wurde.

Grüße
bastla
Member: kkboy94
kkboy94 Jun 13, 2010 at 09:22:14 (UTC)
Goto Top
Hallo bastla,
#Meine Fragen
  • Wie füge ich deine erste Methode richtig in meinen untenstehenden Code ein?
  • Siehe weiter unten

:restart1
echo Sie haben eine falsche Auswahl getroffen. 
echo Bitte die Auswahl wiederholen.
echo.
:cont
set "question1="  
set /p question1=Sollen der Key und die Profile gesichert werden?(Ja/Nein):  
if not defined question1 goto restart1 
if /i %question1:~,1%==J goto backup 
goto backupelse


:restart2
echo Sie haben eine falsche Auswahl getroffen. 
echo Bitte die Auswahl wiederholen.
echo.
:backupelse
set "question2="  
set /p question2=Sollen die Profile wieder hergestellt werden?(Ja/Nein):
if not defined question2 goto restart2 
if /i %question2:~,1%==J goto copy 

:copyelse
if /i %question1:~1%==J 
 if /i %question2:~1%==J ( 
echo Sie haben keine der beiden Aktionen gewaehlt.
echo Das Programm wird nun geschlossen.
ping localhost -n 5 >nul
goto :eof
)
echo Beliebige Taste zum Beenden druecken.
pause >nul
goto :eof
Soweit mein Code

nun hatte ich in meinem letzten Post meine Möglichkeit angeführt. Diese Möglichkeit habe ich noch etwas ausgefeilt und bin zu folgendem Ergebnis gekommen:
if /i %question1:~1%==J 
 if /i %question2:~1%==J ( 
echo Sie haben keine der beiden Aktionen gewaehlt.
echo Das Programm wird nun geschlossen.
ping localhost -n 5 >nul
goto :eof
)
echo Beliebige Taste zum Beenden druecken.
pause >nul
goto :eof

Wenn ich bei den beiden Überprüfungsfragen jeweils nicht mit JA (oder ja, Ja, jA....) antworte sollte mir das Programm ja dann sagen, dass ich keine Aktion gewählt habe. Es zeigt mir aber für einen kurzen Augenblick nur "Syntaxfehler" und schließt dann sofort.
Ich weiß aber nicht welcher Syntaxfehler gemeint ist, oder wo ich den finde. Kannst du mir da auch noch bei helfen bastla?

Ich wäre dir sehr verbunden


MfG Karsten
Member: bastla
bastla Jun 13, 2010 at 11:40:23 (UTC)
Goto Top
Hallo kkboy94!

Abgesehen davon, dass die Schreibweise für die Überprüfung nur des ersten Zeichens so
if /i %question1:~,1%==J
oder
if /i %question1:~0,1%==J
aussehen müsste, würdest Du auch eine UND-Verknüpfung für ein zweimaliges "J" durchführen, anstatt auf "NICHT UND NICHT" zu prüfen - daher allenfalls:
if /i not %question1:~,1%==J if /i not %question2:~,1%==J (
    Keine Aktion gewaehlt.
)
Da die Eingaben aber eigentlich einem (Mini-)Menü entsprechen, könntest Du ja vielleicht eher so vorgehen:
echo S = Key und die Profile sichern
echo W = Profile wieder herstellen
echo.
:cont
set "question1="  
set /p question1=Bitte  S  oder  W  eingeben: 
if not defined question1 goto :cont
if /i %question1:~,1%==S goto :backup
if /i %question1:~,1%==W goto :copy
echo.
echo Sie haben keine der beiden Aktionen gewaehlt.
echo Das Programm wird nun geschlossen.
ping localhost -n 5 >nul
goto :eof
Grüße
bastla
Member: kkboy94
kkboy94 Jun 13, 2010 at 12:08:32 (UTC)
Goto Top
So funktionierts prima. Dankeschön für die klasse Hilfe.

Ich glaube ich muss noch ein wenig an der Vereinfachung meiner Programmierung (falls man das so nennen kann) arbeiten. Ich mache ja anscheinend die Sachen komplexer als nötig.

MfG Karsten