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, 5585 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 ..
Ähnliche Inhalte
C und C++
Frage zu einer Kombinierten Umrechnung ohne IF, Arrays (3)

Frage von Protected zum Thema C und C ...

Windows 10
Fenster Mini- Maximieren per Batch-Befehl (2)

Frage von knitti zum Thema Windows 10 ...

Batch & Shell
gelöst Powershell HPE Cmdlet - If - Else (3)

Frage von MasterBaiter zum Thema Batch & Shell ...

Neue Wissensbeiträge
RedHat, CentOS, Fedora

Fedora, RedHat, Centos: DNS-Search Domain setzen

(13)

Tipp von Frank zum Thema RedHat, CentOS, Fedora ...

Drucker und Scanner

Samsung SL-M4025ND, firmware update und (kompatible) Tonerkassetten

(1)

Erfahrungsbericht von markus-1969 zum Thema Drucker und Scanner ...

Heiß diskutierte Inhalte
Batch & Shell
Skripterstellung Lehrling (22)

Frage von 133119 zum Thema Batch & Shell ...

Exchange Server
Microsoft Exchange Weiterleitung mit anderer primären E-Mail Adresse (14)

Frage von Rene12345 zum Thema Exchange Server ...

Windows Userverwaltung
gelöst Wie verfahrt Ihr mit den Windows-Benutzerkonten und -dateien von ausgeschiedenen Mitarbeitern? (14)

Frage von Bl0ckS1z3 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
Devolo DLAN 500 pro Wireless+ (13)

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