Frage zu for do Schleife mit if-Befehl
Hey,
da ich mich in letzter Zeit "sehr intensiv" mit Batch-Programmierung beschäftige, hab ich eine Frage zu
einer Batch-Anleitung.
Und zwar wird auf dieser Seite erklärt wie man in einer for-do-Schleife ein If-Befehl einfügt:
http://www.antonis.de/dos/batchtut/bat-kurs/#12
Mein Problem ist, dass ich trotz Erklärung dieses Beispiel nicht ganz verstehe.
Befehl mit IF
-------------
Alternative Bedingungen (ODER) lassen sich mit einer FOR-Schleife
einfacher darstellen als durch mehrfache IF-Zeilen, z.B.:
Hier wird getestet, ob der Befehlsparameter %1 ein gültiges
Diskettenlaufwerk enthält. (Die Anführungszeichen verhindern
Syntaxfehler, falls %1 leer ist. QUIT s. Lektion #11.)
Kann mir bitte jemand erkären, was da gemacht wird und vorallem was bedeutet %1?
danke
[Edit Biber] Codetags nachgetragen [/Edit]
da ich mich in letzter Zeit "sehr intensiv" mit Batch-Programmierung beschäftige, hab ich eine Frage zu
einer Batch-Anleitung.
Und zwar wird auf dieser Seite erklärt wie man in einer for-do-Schleife ein If-Befehl einfügt:
http://www.antonis.de/dos/batchtut/bat-kurs/#12
Mein Problem ist, dass ich trotz Erklärung dieses Beispiel nicht ganz verstehe.
Befehl mit IF
-------------
Alternative Bedingungen (ODER) lassen sich mit einer FOR-Schleife
einfacher darstellen als durch mehrfache IF-Zeilen, z.B.:
FOR %%x in (A: a: B: b:) do IF "%1"=="%%x" goto OK
QUIT echo Laufwerk %1 ist ungültig!
:OK
Hier wird getestet, ob der Befehlsparameter %1 ein gültiges
Diskettenlaufwerk enthält. (Die Anführungszeichen verhindern
Syntaxfehler, falls %1 leer ist. QUIT s. Lektion #11.)
Kann mir bitte jemand erkären, was da gemacht wird und vorallem was bedeutet %1?
danke
[Edit Biber] Codetags nachgetragen [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 132362
Url: https://administrator.de/forum/frage-zu-for-do-schleife-mit-if-befehl-132362.html
Ausgedruckt am: 08.04.2025 um 11:04 Uhr
8 Kommentare
Neuester Kommentar
Hallo user90,
%1 ist der erste an den Batch übergebene Parameter.
Beispiel mit 2 Batches (im gleichen Verzeichnis):
1. Test.bat
2. Aufruf.bat
Wenn du "Aufruf.bat" startest, wird beim Aufruf von "Test.bat" der Parameter "a:" mit übergeben.
Der Wert "a:" findet sich dort dann in "%1" wieder.
Grüße
rubberman
%1 ist der erste an den Batch übergebene Parameter.
Beispiel mit 2 Batches (im gleichen Verzeichnis):
1. Test.bat
@echo off &setlocal
for %%x in (A: a: B: b:) do if "%1"=="%%x" goto OK
echo Laufwerk %1 ist ungueltiges Diskettenlaufwerk!
pause
goto :eof
:OK
echo Laufwerk %1 ist gueltiges Diskettenlaufwerk!
pause
2. Aufruf.bat
@echo off
Test.bat a:
Wenn du "Aufruf.bat" startest, wird beim Aufruf von "Test.bat" der Parameter "a:" mit übergeben.
Der Wert "a:" findet sich dort dann in "%1" wieder.
Grüße
rubberman
... wobei das Springen aus einer "
Grüße
bastla
for
"-Schleife sich durch Verwendung eines Schalters auch vermeiden lässt:@echo off & setlocal
set "DLW="
for %%x in (A: B:) do if /i "%~1"=="%%x" set DLW=True
if defined DLW goto :OK
echo Laufwerk %1 ist ungueltiges Diskettenlaufwerk!
pause
goto :eof
:OK
echo Laufwerk %1 ist gueltiges Diskettenlaufwerk!
pause
bastla
Moin user90,
ergänzend zu rubberman und bastla:
Wenn du schon einen (cmd.exe-)Batchkurs mitmachst, was natürlich empfehlenswert ist,
dann belaste dich gar nicht erst mit solchen Relikten wie "unbedingten Sprunganweisungen".
Ein "goto :labelX" ist niemals wirklich nötig und bequem immer nur dann,
wenn zu einem Programmfehler gekommen ist...da gilt dann immer "Fehlermeldung anzeigen und Ende".
Wenn du es lesbar halten willst, dann nutze durchaus die "IF.. ) ELSE ( ..)"-Struktur, die ja das logische WENN-DANN-SONST lesbar abbildet.
bastlas Variante wäre so etwas lesbarer:
...obwohl auch reichen würde..
Grüße
Biber
ergänzend zu rubberman und bastla:
Wenn du schon einen (cmd.exe-)Batchkurs mitmachst, was natürlich empfehlenswert ist,
dann belaste dich gar nicht erst mit solchen Relikten wie "unbedingten Sprunganweisungen".
Ein "goto :labelX" ist niemals wirklich nötig und bequem immer nur dann,
wenn zu einem Programmfehler gekommen ist...da gilt dann immer "Fehlermeldung anzeigen und Ende".
Wenn du es lesbar halten willst, dann nutze durchaus die "IF.. ) ELSE ( ..)"-Struktur, die ja das logische WENN-DANN-SONST lesbar abbildet.
bastlas Variante wäre so etwas lesbarer:
@echo off & setlocal
for %%x in (A: B:) do if /i "%~1"=="%%x" set "DLW=True"
IF defined DLW (
echo Laufwerk %1 ist ein gueltiges Diskettenlaufwerk!
) ELSE (
echo Laufwerk %1 ist kein gueltiges Diskettenlaufwerk!
)
pause
...obwohl auch reichen würde..
@echo off & setlocal
Set "DLW=kein"
for %%x in (A: B:) do if /i "%~1"=="%%x" set "DLW=ein"
echo Laufwerk %1 ist %DLW% gueltiges Diskettenlaufwerk!
pause
Grüße
Biber
@Biber
Grundsätzliche Zustimmung, allerdings könnte sich (wenn mehr zu tun ist, als eine lapidare Meldung auzugeben) als Nachteil aus der Verwendung von
Grüße
bastla
Grundsätzliche Zustimmung, allerdings könnte sich (wenn mehr zu tun ist, als eine lapidare Meldung auzugeben) als Nachteil aus der Verwendung von
IF () ELSE ()
ergeben, dass "delayedExpansion
" erforderlich wird (was ich hinsichtich der "!"-Problematik zu vermeiden trachte) ...Grüße
bastla
Hallo user90!
Das Ganze ist ja offensichtlich nur als Übungsbeispiel gedacht, und daher zeigt die Ausgabe eigentlich nur, welches Ergebnis das "
Grüße
bastla
Nur ich weiß nicht was mit gültiges / ungültiges Diskettenlaufwerk gemeint ist.
Da Diskettenlaufwerke im Normalfall die Laufwerksbuchstaben A: oder B: tragen, wird damit einfach nur geprüft, ob der beim Aufruf übergebene erste Parameter (= %1) "A:" oder "a:" oder "B:" oder "b:" lautet - wenn nicht, wird damit kein gültiges Diskettenlaufwerk angesprochen, anderenfalls wird angenommen, dass die Eingabe gültig ist. (Ob allerdings zB das Laufwerk B: dann auch tatsächlich vorhanden ist und auch noch eine Diskette enthält, ist eine ganz andere Frage ...)Das Ganze ist ja offensichtlich nur als Übungsbeispiel gedacht, und daher zeigt die Ausgabe eigentlich nur, welches Ergebnis das "
IF
" gebracht hat.Grüße
bastla
Nur noch als abschließende Anmerkung zu:
- gerne auch so geschrieben
:
greifen ...
Grüße
bastla
Alternative Bedingungen (ODER) lassen sich mit einer FOR-Schleife
einfacher darstellen als durch mehrfache IF-Zeilen
Im Zweifelsfall würde ich eher zur "einfacher darstellen als durch mehrfache IF-Zeilen
findstr
"-Methode, etwa@echo off & setlocal
echo #A:#B:#|findstr /i "#%~1#">nul && goto :OK
echo Laufwerk %1 ist ein ungueltiges Diskettenlaufwerk!
goto :eof
:OK
echo Laufwerk %1 ist ein gueltiges Diskettenlaufwerk!
@echo off & setlocal
echo #A:#B:#|findstr /i "#%~1#">nul && (
echo Laufwerk %1 ist ein gueltiges Diskettenlaufwerk!
) || (
echo Laufwerk %1 ist ein ungueltiges Diskettenlaufwerk!
)
Grüße
bastla