Problem in Batch
steffen
- programmiertechnik
0 jobo0 steffen
0 Vinzenz Mai0 steffen
0 dedlfix
Hallo Forumleser,
bin wirklich am verzweifeln mit einer Batch-File.
ich fordere den Benutzer auf eine Eingabe zu machen. Diese wären 1-4 falls er jedoch 5 eingibt soll die Abfrage nochmal kommen.
Dies funktioniert auch, jedoch nicht in meinem bestimmten Fall.
Habe dies mal nachgestellt:
ECHO OFF
cls
goto SetVar
:SetVar
if %2!==! (
set /P test=Type:
echo %test%
goto SetVar
)
Er frägt nach der Eingabe. Danach bringt er mir "ECHO is off." und wiederholt die Eingabe. Danach zeigt er mir Eingabe1 an. So geht das die ganze Zeit.
Type:test
ECHO is off.
Type:test1
test
Type:test2
test1
Wenn ich die if %2!==! wegmache funkioniert es wunderbar.
Kann mir jemand erklären wieso das so ist und wie ich das beheben kann?
Vielen Dank
Steffen
Hallo,
%2 bezieht sich in dem Fall wohl auf den 2. Parameter, der mit dem Aufruf von setVar übergeben wird. Da aber nie einer übergeben wird ...??? != ist ja oft "nicht gleich", das kann ich auf die Schnelle bei Win-Batch aber nicht finden, schon garnicht !==!. Vielleicht schnurrt ja Vinzenz mal vorbei ... ???
Gruß
jobo
Hallo Jobo,
habe eine Seite gefunden in der das jedoch so erklärt wird:
http://www.its05.de/computerwissen-computerhilfe/programmierung/stapelverarbeitung_s1/stapelverarbeitung_s7.html
LG Steffen
Hallo,
bin wirklich am verzweifeln mit einer Batch-File.
ich fordere den Benutzer auf eine Eingabe zu machen. Diese wären 1-4 falls er jedoch 5 eingibt soll die Abfrage nochmal kommen.
das ist eine Aufgabe, für die Microsofts Kommandozeileninterpreter nicht besonders geeignet sind. Batchdateien sind typischerweise *nicht* interaktiv und die Kontrollstrukturen von CMD machen es einem nicht leicht.
Dies funktioniert auch, jedoch nicht in meinem bestimmten Fall.
Habe dies mal nachgestellt:
ECHO OFF
clsgoto SetVar
:SetVar
if %2!==! (
set /P test=Type:
echo %test%
goto SetVar
)
jobo hat Dich auf die %2-Problematik hingewiesen. Du hast gar keinen solchen Parameter. Die Eingabe wird bei Dir in die Variable "test" eingelesen. Daher solltest Du diese verwenden.
help if
zeigt Dir, was if kann und was nicht. Kommen wir zu verschiedenen Lösungsansätzen:
a) Vergleiche nacheinander mit den erlaubten Werten. Trifft einer zu, darf
weitergemacht werden, trifft keiner zu, gehe zurück zum Anfang:
---------------------------------------------------------------------
ECHO OFF
cls
:SetVar
REM Fordere zur Eingabe auf
set /P test=Type:
REM Vergleiche den Eingabewert (eine Zeichenkette) mit den erlaubten Werten.
REM Springe zu weiter, wenn eine Übereinstimmung vorliegt.
if %test%==1 GOTO :weiter
if %test%==2 GOTO :weiter
if %test%==3 GOTO :weiter
if %test%==4 GOTO :weiter
GOTO SetVar
:weiter
ECHO %test%
---------------------------------------------------------------------
Schön ist das nicht, arbeitet aber nach Spezifikation :-)
b) Nutze für den Vergleich die for-Anweisung, siehe help for:
Springe bei einem erfolgreichen Vergleich zur weiter-Marke
Falls keiner der Vergleiche erfolgreich war, gehe zurück zu Los.
---------------------------------------------------------------------
ECHO OFF
cls
REM Fordere zur Eingabe auf
:Eingabe
set /P test=Type:
FOR /L %%I IN (1,1,4) DO IF "%%I"=="%test%" GOTO weiter
GOTO Eingabe
:weiter
ECHO %test%
---------------------------------------------------------------------
b) ist schon deutlich besser.
c) Wer auf die Idee kommt, die Option /I von IF zu verwenden, um numerische Vergleiche verwenden zu können mit anderen als dem Gleichheitsoperator, den bestraft CMD damit, dass Eingaben Zeichenketten sind:
---------------------------------------------------------------------
ECHO OFF
cls
:SetVar
REM Fordere zur Eingabe auf
set /P test=Type:
REM Wenn der Eingabewert größer ist als 4, gehe zurück zu Los
IF /I %test% GTR 4 GOTO SetVar
REM Wenn der Eingabewert kleiner ist als 1, gehe zurück zu Los
IF /I %test% LSS 1 GOTO SetVar
REM Wenn wir hier angelangt sind, war die Eingabe möglicherweise im erlaubten Bereich
ECHO %test%
---------------------------------------------------------------------
funktioniert mit Eingaben wie
12
4
7
0
bestens, aber nicht mit Eingaben wie
22.4 oder 3mal
Da die Fähigkeiten von CMD hier sehr beschränkt sind, nutzte ich eher die Powershell oder den Windows Scripting Host.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
danke für die Ausführliche Hilfestellung.
Ich habe jetzt noch ein bisschen rechachiert und habe die Lösung gefunden:
Funktioniert nicht:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
----------------------------------------------------------
Funktioniert:
SETLOCAL EnableDelayedExpansion
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
LG Steffen
Hi!
ECHO OFF
Er frägt nach der Eingabe. Danach bringt er mir "ECHO is off."
Diese Ausgabe willst du doch gar nicht haben und kannst sie mit einem @ vor dem echo off unterdrücken.
Lo!