Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Frage zu for do Schleife mit if-Befehl

Frage Entwicklung Batch & Shell

Mitglied: user90

user90 (Level 1) - Jetzt verbinden

28.12.2009, aktualisiert 16:56 Uhr, 5572 Aufrufe, 8 Kommentare

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.:
01.
        FOR %%x in (A: a: B: b:) do IF "%1"=="%%x" goto OK 
02.
        QUIT echo Laufwerk %1 ist ungültig! 
03.
        :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]
Mitglied: rubberman
28.12.2009 um 14:14 Uhr
Hallo user90,

%1 ist der erste an den Batch übergebene Parameter.
Beispiel mit 2 Batches (im gleichen Verzeichnis):

1. Test.bat
01.
@echo off &setlocal 
02.
for %%x in (A: a: B: b:) do if "%1"=="%%x" goto OK 
03.
echo Laufwerk %1 ist ungueltiges Diskettenlaufwerk! 
04.
pause 
05.
goto :eof 
06.
:OK 
07.
echo Laufwerk %1 ist gueltiges Diskettenlaufwerk! 
08.
pause
2. Aufruf.bat
01.
@echo off 
02.
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
Bitte warten ..
Mitglied: bastla
28.12.2009 um 14:51 Uhr
... wobei das Springen aus einer "for"-Schleife sich durch Verwendung eines Schalters auch vermeiden lässt:
01.
@echo off & setlocal 
02.
set "DLW=" 
03.
for %%x in (A: B:) do if /i "%~1"=="%%x" set DLW=True 
04.
if defined DLW goto :OK 
05.
echo Laufwerk %1 ist ungueltiges Diskettenlaufwerk! 
06.
pause 
07.
goto :eof 
08.
:OK 
09.
echo Laufwerk %1 ist gueltiges Diskettenlaufwerk! 
10.
pause
Grüße
bastla
Bitte warten ..
Mitglied: Biber
28.12.2009 um 17:16 Uhr
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:
01.
@echo off & setlocal 
02.
for %%x in (A: B:) do if /i "%~1"=="%%x" set "DLW=True" 
03.
IF defined DLW ( 
04.
   echo Laufwerk %1 ist ein gueltiges Diskettenlaufwerk! 
05.
) ELSE ( 
06.
   echo Laufwerk %1 ist kein gueltiges Diskettenlaufwerk! 
07.
08.
pause
...obwohl auch reichen würde..
01.
@echo off & setlocal 
02.
Set "DLW=kein" 
03.
for %%x in (A: B:) do if /i "%~1"=="%%x" set "DLW=ein" 
04.
 
05.
echo Laufwerk %1 ist %DLW% gueltiges Diskettenlaufwerk! 
06.
pause
Grüße
Biber
Bitte warten ..
Mitglied: bastla
28.12.2009 um 17:49 Uhr
@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
Bitte warten ..
Mitglied: user90
28.12.2009 um 19:09 Uhr
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.
Bitte warten ..
Mitglied: bastla
28.12.2009 um 19:25 Uhr
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
Bitte warten ..
Mitglied: user90
28.12.2009 um 19:55 Uhr
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.
Bitte warten ..
Mitglied: bastla
28.12.2009 um 20:14 Uhr
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
01.
@echo off & setlocal 
02.
echo #A:#B:#|findstr /i "#%~1#">nul && goto :OK 
03.
echo Laufwerk %1 ist ein ungueltiges Diskettenlaufwerk! 
04.
goto :eof 
05.
:OK 
06.
echo Laufwerk %1 ist ein gueltiges Diskettenlaufwerk!
- gerne auch so geschrieben :
01.
@echo off & setlocal 
02.
echo #A:#B:#|findstr /i "#%~1#">nul && ( 
03.
    echo Laufwerk %1 ist ein gueltiges Diskettenlaufwerk! 
04.
) || ( 
05.
    echo Laufwerk %1 ist ein ungueltiges Diskettenlaufwerk! 
06.
)
greifen ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Seltsames Verhalten bei Errorlevel abfrage in FOR DO Schleife (1)

Frage von Kalma73 zum Thema Batch & Shell ...

C und C++
Frage zu einer Kombinierten Umrechnung ohne IF, Arrays (3)

Frage von Protected zum Thema C und C ...

LAN, WAN, Wireless
gelöst HP Switches - Frage zu Spanning Tree bzw. Loop Back Protection (12)

Frage von chfran zum Thema LAN, WAN, Wireless ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...