user90
Goto Top

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.:
        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]

Content-Key: 132362

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

Printed on: April 19, 2024 at 01:04 o'clock

Member: rubberman
rubberman Dec 28, 2009 at 13:14:51 (UTC)
Goto Top
Hallo user90,

%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
Member: bastla
bastla Dec 28, 2009 at 13:51:43 (UTC)
Goto Top
... wobei das Springen aus einer "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
Grüße
bastla
Member: Biber
Biber Dec 28, 2009 at 16:16:41 (UTC)
Goto Top
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:
@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
Member: bastla
bastla Dec 28, 2009 at 16:49:33 (UTC)
Goto Top
@Biber
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
Member: user90
user90 Dec 28, 2009 at 18:09:14 (UTC)
Goto Top
danke euch allen für die Hilfe,

jetzt weiß ich endlich was %1 bedeutet...
aber so ganz genau weiß ich leider nicht was dieser Test.bat macht.
Wenn ich in Aufruf.bat z.B.: b: eingebe, dann wird er in Test.bat übernommen das ist klar.
Nur ich weiß nicht was mit gültiges / ungültiges Diskettenlaufwerk gemeint ist.

Ich bin noch ein totaler Anfänger was Programmieren allgemein angeht, deshalb wäre
es nett, wenn ihr ausführlicher antworten würdet.
Member: bastla
bastla Dec 28, 2009 at 18:25:28 (UTC)
Goto Top
Hallo user90!
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
Member: user90
user90 Dec 28, 2009 at 18:55:09 (UTC)
Goto Top
ok,
vielen Dank für die schnelle Antwort, ich glaube ich hab´s jetzt verstanden.
Ich lass das Thema (falls keiner was dagegen hat) trotzdem auf, da mir vllt. andere Dinge
beim Lesen der Anleitung nicht ganz klar sein sollten.
Member: bastla
bastla Dec 28, 2009 at 19:14:16 (UTC)
Goto Top
Nur noch als abschließende Anmerkung zu:
Alternative Bedingungen (ODER) lassen sich mit einer FOR-Schleife
einfacher darstellen als durch mehrfache IF-Zeilen
Im Zweifelsfall würde ich eher zur "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!
- gerne auch so geschrieben face-wink:
@echo off & setlocal
echo #A:#B:#|findstr /i "#%~1#">nul && ( 
    echo Laufwerk %1 ist ein gueltiges Diskettenlaufwerk!
) || (
    echo Laufwerk %1 ist ein ungueltiges Diskettenlaufwerk!
)
greifen ...

Grüße
bastla