dissi-xd
Goto Top

Wie kann ich zwei variable Nummern mit IF vergleichen?

Guten Tag,

ich versuche seit Stunden eine if zum Laufen zu bringen.

Es geht darum zwei Zahlen miteinander zu vergleichen, für eine Loop. Der User soll angeben wie viele Durchläufe die Loop machen soll. Anschließend wird die Counter-Variable auf 1 gesetzt.
Nachher folgt die :loop. In dieser soll zu erst mittels if geschaut werden, ob sie nochmals die Befehle ausführen soll oder eben nicht. Wenn also der Counter kleiner oder gleich der Anzahl der Durchläufe ist, werden Befehle ausgeführt, der Counter +1 gemacht und springt wieder zur :loop. Ansonsten Exit.

Der Code sieht in etwa so aus:

set /p amount="Wie viele Durchläufe soll die Schleife machen? (1, 2, 3, ...) "  
set /a counter=1

:loop
    if %counter% LEQ %amount% (
        echo Ich führe Befehle aus.
	set /a "counter+=1"  
        goto :loop
    ) else (
        exit
    )

Ich habe schon alles Mögliche versucht. Verschiedene Schreibweisen des if's (Vergleichsoperator, if not, %variable%, "%variable%", !variable!, ...)
Zudem habe ich mit Pause versucht den Fehler zu finden. Habe ihn nicht gefunden, nur festgestellt, dass alles bis auf die if funktioniert. Auch %amount% und %counter% werden richtig abgespeichert, also bei der Ausgabe kommt das heraus, was herauskommen soll...

Ich bin mittlerweile ratlos. Habt ihr vielleicht eine Idee?

Vielen Dank,
Dissi-xD

Content-ID: 2911578408

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

Ausgedruckt am: 25.11.2024 um 04:11 Uhr

em-pie
em-pie 27.05.2022 aktualisiert um 14:34:07 Uhr
Goto Top
Moin,

mir fällt spontan deine Zeile 7 auf.
Du verwendest hier counterl und nicht counter

Ferner würde es so mehr Sinn ergeben:
set /p amount="Wie viele Durchläufe soll die Schleife machen? (1, 2, 3, ...) "  
set /a counter=1

:loop
    if %counter% LEQ %amount% (
        echo Ich führe Befehle aus.
	set /a counter=%counter%+1
        goto loop
    ) else (
        exit
    )

gruß
em-pie

Edit: goto loop korrigiert
Dissi-xD
Dissi-xD 27.05.2022 um 14:03:46 Uhr
Goto Top
Hi,

ja, ist mir auch gerade aufgefallen, hab's gerade in diesem Moment ausgebessert im Beitrag.

Und natürlich auch im Batch, aber es will immer noch nicht klappen :/

Eigentlich kommt im original Batch als erstes nach dem if eine Abfrage, wo der User wieder eine Zahl eingeben muss. Diese Abfrage kommt nicht, da es vorher abstürzt. Aber wenn ich z.B. vor dem if ein PAUSE setze, steht "Beliebige Taste drücken..." wenn ich dann z.B. Enter drücke, stürzt das Skript wieder ab...

Der Fehler ist meiner Meinung nach ziemlich genau beim der Schreibweise des if, da es genau dort abstürzt. Aber ich weiß nicht, wie ich das if anders schreiben soll/kann...
Dissi-xD
Dissi-xD 27.05.2022 aktualisiert um 14:36:59 Uhr
Goto Top
Zitat von @em-pie:

Moin,

mir fällt spontan deine Zeile 7 auf.
Du verwendest hier counterl und nicht counter

Ferner würde es so mehr Sinn ergeben:
set /p amount="Wie viele Durchläufe soll die Schleife machen? (1, 2, 3, ...) "  
set /a counter=1

:loop
    if %counter% LEQ %amount% (
        echo Ich führe Befehle aus.
	set /a counter=%counter%+1
        goto :loop
    ) else (
        exit
    )

gruß
em-pie

Vielen Dank für deine Antwort face-smile

Ja, das mit dem counterl ist mir auch schon aufgefallen (siehe Kommentar) aber das war nicht das Problem.
em-pie
em-pie 27.05.2022 aktualisiert um 14:33:42 Uhr
Goto Top
Fehler Nummer zwei:

du schreibst goto :loop
es müsste aber goto loop lauten

Edit: habe es oben von dir falsch mitkopiert ^^

P.S. beschäftige dich, wenn du gerade am Beginn deiner Scripting-Karriere unter Windows stehen solltest, direkt mit der Powershell face-wink
Dissi-xD
Dissi-xD 27.05.2022 um 14:42:46 Uhr
Goto Top
Zitat von @em-pie:

Fehler Nummer zwei:

du schreibst goto :loop
es müsste aber goto loop lauten

Edit: habe es oben von dir falsch mitkopiert
P.S. beschäftige dich, wenn du gerade am Beginn deiner Scripting-Karriere unter Windows stehen solltest, direkt mit der Powershell face-wink

Danke, die Doppelpunkte sind mir gar nicht aufgefallen. Aber das war anscheinend auch nicht das Problem für die if :/

Naja, Skripting-Karriere würde ich es nicht nennen. Habe nur etwas Batch in der Schule gelernt und das ist recht nützlich bei der Arbeit, wenn man z.B. ~500 PDFs aus einem Ordner mit über 10.000 PDFs suchen und herauskopieren muss

Nur habe ich jetzt das Problem, dass die PDFs aus verschiedenen Ordnern stammen, welche ähnlich heißen. Und dafür brauche ich diese if...
em-pie
em-pie 27.05.2022 um 15:06:08 Uhr
Goto Top
dann mache es mit der Powershell face-wink

$folder = "c:\myFolderWithPDFs"  

$ALLPDF = Get-ChildItem -Path $folder\* -Include *.PDF
foreach ($PDF in $ALLPDF) {
  write-host "Dateiname: $PDF.Fullname"  
}
Dissi-xD
Dissi-xD 27.05.2022 um 15:09:18 Uhr
Goto Top
Zitat von @em-pie:

dann mache es mit der Powershell face-wink

$folder = "c:\myFolderWithPDFs"  

$ALLPDF = Get-ChildItem -Path $folder\* -Include *.PDF
foreach ($PDF in $ALLPDF) {
  write-host "Dateiname: $PDF.Fullname"  
}

Das Problem ist eben, dass ich das jeden Monat machen muss. Jedes mal mit dem neuen Ordner bzw. bei dem aktuellen Skript soll es verschiedene ältere Ordner durchsuchen und kopieren. Zudem möchten meine Kollegen auch das Programm, falls ich mal fehle. Und für die ist es einfacher, wenn sie nur "ein paar Zahlen eingeben müssen".
em-pie
em-pie 27.05.2022 um 15:14:01 Uhr
Goto Top
Zitat von @Dissi-xD:
Das Problem ist eben, dass ich das jeden Monat machen muss. Jedes mal mit dem neuen Ordner bzw. bei dem aktuellen Skript soll es verschiedene ältere Ordner durchsuchen und kopieren. Zudem möchten meine Kollegen auch das Programm, falls ich mal fehle. Und für die ist es einfacher, wenn sie nur "ein paar Zahlen eingeben müssen".

Auch das geht doch alles....
$NameFolder = Read-Host "Geben Sie den Ordnernamen an:"  
$folder = "c:\myFolderWithPDFs\$NameFolder"  

$ALLPDF = Get-ChildItem -Path $folder\* -Include *.PDF
foreach ($PDF in $ALLPDF) {
  write-host "Dateiname: $PDF.Fullname"  
}
Penny.Cilin
Penny.Cilin 27.05.2022 um 15:25:05 Uhr
Goto Top
Zitat von @em-pie:

Fehler Nummer zwei:

du schreibst goto :loop
es müsste aber goto loop lauten

Edit: habe es oben von dir falsch mitkopiert ^^

P.S. beschäftige dich, wenn du gerade am Beginn deiner Scripting-Karriere unter Windows stehen solltest, direkt mit der Powershell face-wink


Zitat von @em-pie:

Fehler Nummer zwei:

du schreibst goto :loop
es müsste aber goto loop lauten
Das ist nicht das Problem. GoTo :Loop ist schon korrekt. Mache ich auch immer.

@Dissi-xD
@Dissi-xD
Mache in der Schleife mache jedem Befehl ein Echo und Pause.
Dan siehst Du wo das Problem ist.

:loop
    if %counter% LEQ %amount% (
        echo Ich führe Befehle aus.
        (echo counter ist %counter% und amount ist %amount% & pause)
	set /a counter=%counter%+1
        (echo nach der berechnung counter ist %counter% & pause)%
        goto :loop
    ) else (
        exit
    )

Gruss Penny.
Dissi-xD
Dissi-xD 27.05.2022 um 15:30:19 Uhr
Goto Top
Ok... komisch, dachte gerade, dass es nach dem Statement und vor der ( ein do braucht. Hingeschrieben, dann läuft es. es kommt zwar ein Fehler, dass der Befehl do nicht gefunden wurde, aber es geht in die if hinein...
Dissi-xD
Dissi-xD 27.05.2022 um 15:32:16 Uhr
Goto Top
Zitat von @Penny.Cilin:

Zitat von @em-pie:

Fehler Nummer zwei:

du schreibst goto :loop
es müsste aber goto loop lauten

Edit: habe es oben von dir falsch mitkopiert ^^

P.S. beschäftige dich, wenn du gerade am Beginn deiner Scripting-Karriere unter Windows stehen solltest, direkt mit der Powershell face-wink


Zitat von @em-pie:

Fehler Nummer zwei:

du schreibst goto :loop
es müsste aber goto loop lauten
Das ist nicht das Problem. GoTo :Loop ist schon korrekt. Mache ich auch immer.

@Dissi-xD
@Dissi-xD
Mache in der Schleife mache jedem Befehl ein Echo und Pause.
Dan siehst Du wo das Problem ist.

:loop
    if %counter% LEQ %amount% (
        echo Ich führe Befehle aus.
        (echo counter ist %counter% und amount ist %amount% & pause)
	set /a counter=%counter%+1
        (echo nach der berechnung counter ist %counter% & pause)%
        goto :loop
    ) else (
        exit
    )

Gruss Penny.

Habe ich schon gemacht, das Problem scheint irgendwie die if zu sein. Es geht nie in die if hinein, es stürzt genau an dieser Zeile ab. Es geht aber auch nicht ins else hinein, denn da habe ich ein goto end und dort wäre eigentlich ein PAUSE...
Dissi-xD
Dissi-xD 27.05.2022 um 16:00:03 Uhr
Goto Top
Wollte es nun mit einer for-Schleife versuchen, aber irgendwie will die auch nicht richtig...

Wenn ich den Rattenschwanz an Befehlen herausnehme und nur echo %%x mache, wird es korrekt ausgegeben. Der Fehler kann auch nicht im Rattenschwanz sein, denn wenn ich diesen ans Ende stelle, wird er korrekt ausgeführt...

Meine for-schleife:

set /p amount="Wie viele Durchläufe? (1, 2, 3, ...) "  

for /l %%x in (1, 1, %amount%) do (
20 Zeilen Code ausführen
)

funkt aber nicht - hingegen:

set /p amount="Wie viele Durchläufe? (1, 2, 3, ...) "  

for /l %%x in (1, 1, %amount%) do (
echo %%x
)
20 Zeilen Code ausführen

funkt alles, nur brauche ich die 20 Zeilen Code in der Schleife...
em-pie
em-pie 27.05.2022 um 16:49:21 Uhr
Goto Top
Dann poste doch mal die 20 Zwilen Code face-wink
rubberman
Lösung rubberman 28.05.2022 um 22:44:22 Uhr
Goto Top
Zitat von @em-pie:

Dann poste doch mal die 20 Zwilen Code face-wink

Ich vermute 2 Zeilen erklären das auch.
@echo off
for /l %%i in (1,1,10) do (
  set "foo=bar%%i"  
  echo mach was mit %foo%
)
echo versus:
setlocal EnableDelayedExpansion
for /l %%i in (1,1,10) do (
  set "foo=bar%%i"  
  echo mach was mit !foo!
)
pause
Eine Variable wird in einer Kommandozeile oder in einem in Klammern eingefassten Block von Kommandozeilen (wie dem Rumpf der Schleife) nur einmal zu ihrem Wert erweitert, und zwar noch vor der Ausführung der Zeile bzw. des Blocks. Will man diese frühzeitige Erweiterung nicht, stellt man die verzögerte Variablenerweiterung ein und setzt die Variable in Ausrufezeichen statt Prozentzeichen.
Wenn's unbedingt Batch sein soll, muss man sich mit solchen Absonderlichkeiten auseinandersetzen ¯\_(ツ)_/¯

Steffen