Zählvariable unter Dos6

  • Moin,
    ich versuche seit einiger Zeit eine schleife zu bauen, die jedoch anscheinend immer ein Problem unter Dos6.22 hat.
    Jegliche Hilfe im Netz scheint sich auf neuere CMD-Komandos zu beziehen.


    Eine Möglichkeit wäre eine Zähl-Variable zu benutzen und dann Sprünge über goto zu wählen.
    Leider kann dos6 das "set /a" nicht und so komme ich schon zum Hochzählen der Variable nicht. Hat da wer ne anderen Vorschlag?


    Eine andere Möglichkeit wäre über eine For-Schleife.
    In einem Einzeller klappt das auch über "for $i in (1 2 3 4) do echo %i" ganz gut, aber sobald ich mit Klammern mehrere Befehle hinter dem "do" schreibe mag er das nicht. Vielleicht gibts auch hier ne Möglichkeit?


    Oder jemand hat nen ganz anderen Vorschlag wie ich unter Ms Dos 6.22 eine Schleife vier mal durchlaufe und mehrere Befehle aufrufe.

    Neo Geo | C64 | A500+ | A1000 (GB-Edition) | A3000D rev.9.01 | A4000D rev.B | Compaq Armada 4200

  • Na das was Du in der FOR Schleife hinten mehrfach aufrufen willst, stecke einfach in eine weitere BATch-Datei.
    Dann rufe diese neue BATch-Datei einfach in der FOR Schleife mit CALL BATchdateiname %i auf ...

    "Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind."


    ... und schaut auch mal bei meinem Blog vorbei ...

  • Du meinst mit "for %i in (1 2 3 4) do call neue.bat %i "?
    Übernimmt die "neue.bat" auch die übergebene Variable "%i"?
    In einer einzelnen bat-Datei geht das nicht? Etwas unschön, meiner Meinung nach (wollte alles in einer Datei haben), aber wenns keine alternative gibt wäre das sicherlich möglich.
    Nur wie bekomme ich dann das Ergebnis zur weiteren Nutzung in die erste Bat?

    Neo Geo | C64 | A500+ | A1000 (GB-Edition) | A3000D rev.9.01 | A4000D rev.B | Compaq Armada 4200

  • Hallo, in der neuen Batchdatei kannst du die Variable %i dann als %1 auslesen. %2 wäre ein %j, usw. Das geht bis %8, dort würde die 8. übergebene Variable drin stecken. In %9 steckt dann alles drin, das darüber hinaus geht.


    Beispiel:


    echo off
    rem testbatch1.bat
    call testbatch2.bat eins zwei drei vier fuenf sechs sieben acht neun zehn elf


    echo off
    rem testbatch2.bat
    echo %1
    echo %2
    echo %3
    echo %4
    echo %5
    echo %6
    echo %7
    echo %8
    echo %9


    c:\testbatch1
    eins
    zwei
    drei
    vier
    fuenf
    sechs
    sieben
    acht
    neun zehn elf


    Testbatch2 könnte man auch so schreiben:


    echo off
    rem testbatch2.bat
    :loop
    echo %1
    shift
    if not x%1==x goto loop


    Die Ausgabe wäre identisch.


    Ich bin mir nicht mehr sicher, da selten verwendet. Es könnte auch sein, dass du in MS-DOS 6.22 auch Calls auf Label innerhalb der selben Batch machen kannst. Musst du mal ausprobieren. Ich kann mich aber nicht mehr erinnern, wie das dort mit Variablen geht, ob man dann hinter dem Label-Call noch Variablen übergeben kannst. Beispiel, ich habe jetzt keine Dose da um das auszuprobieren:


    echo off
    rem testbatsch
    echo vor call 1
    call :label1
    echo nach call 1 vor call 2
    call :label2 mit uebergabe
    echo nach call 2
    exit
    :label1
    echo im call 1
    exit
    :label2
    echo im call 2 %1 %2
    exit


    Wenn es klappt, sollte das hier rauskommen:


    vor call 1
    im call 1
    nach call 1 vor call 2
    im call 2 mit uebergabe
    nach call 2

  • Um Parameter an beliebig viele andere BATch-Dateien weiterzugeben, kann man mit dem SET Befehl neue Umgebungsvariablen setzen, natürlich auch in der via CALL aufgerufenen BATch-Datei. Der gesetzte Wert sollte auch nach Verlassen der BATch-Datei noch gesetzt sein.

    "Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind."


    ... und schaut auch mal bei meinem Blog vorbei ...

  • Wenn dir das mit zwei Dateien missfällt, kannst Du das auch in einer lösen.
    Ich mache das mit meinen Shellscripten oft so, dass ich das Script sich selbst
    aufrufen lassen und anhand der Parameter erkenne, dass es jetzt quasi die
    zweite Datei sein soll:


    if x%1==xschritt2 goto schritt2
    schritt1:
    for %i in (1 2 3 4) do call mich.bat schritt2 %i
    goto ende
    schritt2:
    echo %2
    ende:

  • Nabend,
    habe heute mal wieder es mit Dos probiert und irgendwie vertragen wir uns zwei nicht *g*


    Ich wollte es erstmal mit nem Aufruf einer Funktion/Subroutine probieren. Im Netz ist dazu einiges zu finden, jedoch klappt das ganze irgendwie nicht.
    Mein Test-Script lautet wie folgt:

    Code
    1. for %%i in (1 2 3 4) do call :run %%i
    2. goto EOF
    3. :run
    4. echo %1
    5. goto EOF
    6. :eof


    Hier bekomme ich immer wieder den Hinweis, dass

    Code
    1. c:\>call :run 1
    2. Befehl oder Dateiname nicht gefunden
    3. c:\>call :run 2
    4. Befehl oder Dateiname nicht gefunden
    5. c:\>call :run 3
    6. Befehl oder Dateiname nicht gefunden
    7. c:\>call :run 4
    8. Befehl oder Dateiname nicht gefunden
    9. c:\>


    Auch wenn ich aus der Zeile mit der For-Schleife ein einfaches "call run 1" aufrufe, kommt der gleiche Fehler.
    Anscheinend kann der Befehl Call keine Subroutinen aufrufen.


    Mein zweiter Versucht war dann über ein goto das hinzubekommen

    Code
    1. for %%i in (1 2 3 4) do goto run %%i
    2. goto EOF
    3. :run
    4. echo %1
    5. goto EOF
    6. :eof


    Nur hier scheint es so zu sein, dass die Subroutine keine Parameter übernimmt. Die Zeile "echo %1" scheint nicht ausgeführt zu werden. Auch bin ich mir mit dem "goto EOF" unsicher ob dann die Schleife mehrmals durchlaufen wird.

    Neo Geo | C64 | A500+ | A1000 (GB-Edition) | A3000D rev.9.01 | A4000D rev.B | Compaq Armada 4200

    Edited 2 times, last by echo ().

  • Habe schon ewig keine Batches unter reinem DOS programmiert, verdammt wie primitiv das war... (das selbe dachte ich als ich nach vielen Jahren das erste Mal wieder den Explorer von Windows 95 sah) Unter Windows XP und neuer klappt das. :(

  • Ein ".... DO CALL :LABEL" bzw. ".... DO CALL LABEL" (weil man eigentlich beim Benutzen der Label kein : voranstellt) ist IMHO Quatsch, weil der CALL Befehl nur für das Aufrufen von weiteren Batch-Jobs genutzt werden kann, ist ja kein BASIC. Und mit dem Befehl GOTO können nicht gleichzeitig auch noch weitere Parameter vom Label abgesehen übergeben werden.
    Wenn Du was hochzählen willst, geht das mit SET /A.


    echo off
    echo Ctrl-Break to stop loop
    set zaehler=0
    :start
    set /a zaehler=%zaehler%+1
    echo %zaehler%
    pause
    goto start


    Zumindest läuft das o.g. in der Kommandozeile unter Windows XP (eben ausprobiert). Mit DOSBox kann ich es ja nicht ausprobieren :-(

    "Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind."


    ... und schaut auch mal bei meinem Blog vorbei ...

  • set /a wird von MS-DOS nicht unterstützt. Und cal :label kann unter 2000 und neuer (wie weit das zurück geht weiß ich nicht) zum Aufrufen von Subroutinen verwendet werden.

  • 1st1 hat recht. Das "set /a" funktioniert unter MS Dos nicht. Das war das erste worauf ich im Netz gestoßen und bei meinen Versuchen auch gleich gescheitert bin.
    Im Netz wird häufig MS-Dos und die CMD-Syntax vermischt und daher ist es schwierig Infos aus dem Netz dazu zu erhalten.


    Ich hoffe noch, dass jemandem hier noch was einfällt, ansonsten müsste ich es über ne zweite Batch-Datei lösen oder mir was ganz anderes überlegen...

    Neo Geo | C64 | A500+ | A1000 (GB-Edition) | A3000D rev.9.01 | A4000D rev.B | Compaq Armada 4200

  • vor langer Zeit...
    ...hatte ich auch das gleiche Problem.


    Damals hatte ich mir ein "calc4bat" gebastelt, dass mit einen kleinen Batch ein wenig rechnen konnte (Addition, Subtraktion).


    loop.bat:
    echo off
    set L=0
    :loop
    call calc L %l% + 1


    echo SchleifeSchleife %L%


    if not %L%==4 goto loop
    :end



    dazu braucht man:
    a) calc.bat:
    echo off
    calc4bat %1 %2 %3 %4 > do.bat
    call do.bat
    del do.bat
    b) calc4bat.exe


    Unter DOS von Win98 sieht das dann so aus:
    >loop
    Schleife 1
    Schleife 2
    Schleife 3
    Schleife 4
    >


    evtl muss die Verwendung der Variablen für 6.22 noch angepasst werden (?) .... %% vs %v%...
    Wie man sieht, wird bei jedem Ablauf eine Datei "do.bat" erst erzeugt, aufgerufen und zum Schluss wieder gelöscht.
    Nicht elegant aber funktioniert ;-)


    ---der Anhang ist ein tgz, die ich zum Hochladen nur JPEG genannt habe---

  • Also ich hab jetzt meinen letzten Vorschlag nochmal getestet. Ich hab hier zwar nur ein Windows7, aber ich verwende keine neueren Features von Batchdateien.
    Das einzige bei dem ich mir nicht sicher bin ist %0, das müsstest Du evtl. durch den Namen der Batchdatei ersetzen, diese ruft sich selbst auf.


  • Also das hat mir jetzt doch keine Ruhe gelassen 8-) und so Aussagen "müsste eigentlich" und "probier mal" mag ich nicht so gern hören.
    Und dann lass ich sie selbst vom Stapel ... :whistling:
    Ich hab mir ein DOS 5 in VMWare installiert und mein Batchfile abgetippt. (Gibt leider keine Gasterweiterung für MS-DOS 5 - komisch)


    Es geht!

  • In %0 steht immer der Dateiname der gerade laufenden Batchdatei oder des gerade ausgeführten Programms drin. Die Batchdatei oder das Programm kann so feststellen, wie es heißt. Das kann man natürlich auch für fiese Tricks benutzen... Auf dem ATARI ST (der ja betriebssystemseitig (BIOS, XBIOS, TOS und GEMDOS Schichten) sehr MS-DOS-artig ist) wird das z.B. in diversen Auto-Ordnerprogrammen benutzt, z.B. reserviert das ATARI-eigene Tool cache100.prg 100 kB Plattencache, benennt man es in cache50.prg um, reserviert es nur 50 kB Plattencache...

  • Ja, ich war mir nur nicht sicher seit wann das in DOS geht. Unter Unix ist das ja schon Jahrhunderte drin.
    Aber wie gesagt, es geht auch in MS-DOS 5.
    Der Vorteil dieser Lösung ist, dass man keine Hilfsdateien benötigt, denn die Datei ist ihre eigene Hilfsdatei.


    call :run geht in Windows 7, nicht aber mit DOS 5.

  • %0 gibts mindestens schon seit DOS 3.20, da habe ich das einst gelernt. Die Diskette mit meinen Batchspielereien von Damals hab ich noch. (Da ist eine Batchdatei dabei, die einen Novellserver zum Abnibbeln bringen kann, einfach so mit (gaaaaaanz vielen) Datei/Ordneroperationen... Dazu musste man sie aber durch einen Batchcompiler laufen lassen, sonst wars nicht schnell genug...)

  • ... und ohne For-Schleife mit den Elementen (auch >9) als Parameter des Batch-Aufrufs geht's auch so:

    echo %1 ist dann z.B. durch call doit %1 zu ersetzen oder die Routine steht innerhalb der Schleife.
    Leider funktionierte damals (TM) auch shift /1 nicht. Das wäre interessant, um den Namen des
    aufgerufenen Programms zu behalten. Was aber geht ist
    set me=%0
    call %me% %1

  • Gibt's eigentlich irgendwo eine Übersicht welche Befehle mit welcher DOS-Version eingeführt bzw. erweitert wurden?


    Wenn ich mir for /? in DOS5 und Windows 7 dann unterscheidet sich das schon "ein wenig".
    doskey war ein Meilenstein und edit war auch "etwas" intuitiver als edlin.

  • Ich fürchte, da musst du dir die Handbücher für die verschiedenen DOS-Handbücher besorgen. Gibts bestimmt irgendwo als PDF online.

  • Ich will's ja nicht machen, nur wissen 8-)
    Ich dachte vielleicht hat jemand irgendwo eine nette Auflistung rumliegen.
    Im Internet hab ich nix (schönes) gefunden.


    Ich glaube ja der Fadenbesitzer hat seine Antwort schon längst extrahieren können, aber
    rein akademisches OT-Gelaber macht halt einfach Spaß. :rotwerd:

  • Besten Dank für die Hilfe.
    Nach längeren probieren und hin und her hab ich es doch wirklich geschafft.


    Neo Geo | C64 | A500+ | A1000 (GB-Edition) | A3000D rev.9.01 | A4000D rev.B | Compaq Armada 4200

  • In Zeile 6 ist noch ein Typo, der ":" sollte weg:

    Code
    1. for %%i in (1 2 3 4) do call %0 run %%i


    :run2 sollte eigentlich nicht angesprungen werden können,
    da Du nach der Zählschleife nach :eof springst.


    Ansonsten sollte es so gehen. :thumbsup:

  • Ja du hast recht das ":" sollte da weg...


    Das run2 wird vom ersten aufrufen durch die Zeile 11 ("if not %1#==run# goto run2") angesprungen.
    Das Script hat sozusagen zwei Sichten. Einmal die für die Durchführung der For-Schleife und die zweite wo es aus der Schleife raus ist.
    In meinem Script dem Ende des run2 noch weitere Sprungmarken. Ich habe mit run2 nur aufzeigen wollen, dass man hier noch weitere Anweisungen durchführen kann.

    Neo Geo | C64 | A500+ | A1000 (GB-Edition) | A3000D rev.9.01 | A4000D rev.B | Compaq Armada 4200

  • Ne, da kommt er garnicht hin. Du springst ja nur ins :run, wenn %1#==run#, sonst
    geht's da weiter geht in die for-Schleife und danach zu :EOF.
    Wenn Du nach :run gesprungen bist ist ja %1#==run#, also niemals ungleich.

  • Du es funktioniert. Probiers doch aus :)


    Wie gesagt, das Script hat zwei Ebenen eine mit Parameter und eine ohne. Und je nach ob der Parameter gesetzt wird oder nicht wird unterschiedliches angesprungen.


    PS:
    vielleicht noch nen Hinweis...
    Die Sprungmarke "run" wird auch ohne den vorher gesetzten Parameter "$0 :run" aufgerufen. Die Sprungmarke im DOS haben kein Ausschlusskriterium.
    Daher muss man, wenn man den Code hinter der Sprungmarke nicht ausführen will, gleich wieder verlassen.

    Neo Geo | C64 | A500+ | A1000 (GB-Edition) | A3000D rev.9.01 | A4000D rev.B | Compaq Armada 4200