steffen: Problem in Batch

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

  1. 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

    1. 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

  2. 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
    cls

    goto 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

    1. 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

  3. 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!