For – Schleife beim Scripting in Batch- Files

Transcription

For – Schleife beim Scripting in Batch- Files
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
For – Schleife beim Scripting in Batch‐ Files (Dateien) 1. Grafische Darstellung STG und UML 2. In der Command – Shell Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985‐2001 Microsoft Corp. D:\Dokumente und Einstellungen\Munz>help for Führt einen Befehl für jede einzelne Datei für einen Satz von Dateien aus. FOR %Variable IN (Satz) DO Befehl [Parameter] %Variable ‐Ein ersetzbarer Parameter bestehend aus einem einzelnen Buchstaben. (Satz) ‐Ein Satz von mindestens einer Datei. Platzhalter sind zulässig. Befehl ‐Befehl, der für jede Datei ausgeführt werden soll. Parameter ‐Parameter und Optionen für den angegebenen Befehl. Um den FOR‐Befehl in einem Batchprogramm zu verwenden, geben Sie %%Variable statt %Variable an. Beachten Sie die Groß‐/Kleinschreibung (Case Sensitive) bei Variablennamen, %i und %I sind nicht identisch. D:\Dokumente und Einstellungen\Munz\Desktop\Kommunikationstechnik\Praktikum_Kommunikation\Batch&Co\For.doc
1
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Syntax: FOR %%argument IN (Liste) DO Befehl ‐ Dabei bedeutet: For ‐ Erstes Befehlswort für den For‐Befehl %%argument ‐ Variable für den Schleifendurchgang (mit zwei %‐Zeichen und einem Buchstaben). IN ‐ Zweites Befehlswort für den For‐Befehl: das die Variable von ihrer Argumentliste trennt. (Liste) ‐ Argumentenliste für den For‐Befehl: Die Variable nimmt der Reihe nach die Werte in dieser Liste an. Als Listenelemente kommen numerische oder benannte Parameter, Datei(grupp)en, Zeichenketten oder Befehle in Frage. DO ‐ Drittes Befehlswort für den For‐Befehl: Trennt die Liste vom Befehl. Befehl ‐ beliebiger Befehl, der auf die Variable für den Schleifendurchgang zurückgreifen kann. Beispiele: A) In einem Editor schreiben wir unten stehendes Script und speichern es als z.B. Kopieren.bat. (*.bat). Die Extension (Erweiterung muss „bat“ sein). D:\Dokumente und Einstellungen\Munz\Desktop\Kommunikationstechnik\Praktikum_Kommunikation\Batch&Co\For.doc
2
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
B) @echo off For %%d In (1 2 3 4 5 6 7 8 9 10 ) Do md Munz%%d Rem Dieser For‐Befehl kreiert 10 Unterverzeichnisse mit den Namen Rem Munz1 bis Munz 10. Vorteile: + Argumente sind als Zählschleife oder als kopfgesteuerte Schleife einzusetzen. + Befehle können auf alle Elemente einer datei(gruppen)liste angewendet werden ‐ etwa als Del *.* (ohne Abfrage) sowie Type *.* + Verzeichnisse können (nur mit Pfad) abgeprüft werden. + Schleifenschachtelung (aber nur mit dem Call‐ oder dem Command‐Befehl) Nachteile: ‐ Umleitung funktioniert oft nicht wie gewollt. ‐ Es kann nur ein Befehl abgesetzt werden (keine umstandslose Schachtelung) ‐ Keine einfache Zählschleife zu realisieren ‐ Bestimmte Zeichen werden nicht als Argument angenommen [/] ‐ Beschränkung auf 127 Kommandozeichen kommt einschränkend zur Geltung (etwa bei Prüfung zusammengesetzter Bedingungen). Wenn die Befehlserweiterungen aktiviert sind, werden folgende Ergänzungen für den FOR‐Befehl unterstützt: Ö s. Anhang FOR /D %Variable IN (Satz) DO Befehl [Parameter] Wenn der Satz Platzhalter enthält, dann bezieht sich der FOR‐Befehl auf Verzeichnisse und nicht auf Dateien. FOR /R [[Laufwerk:]Pfad] %Variable IN (Satz) DO Befehl [Parameter] Der FOR‐Befehl wird ausgehend vom Verzeichnis [Laufwerk:]Pfad (als Stammverzeichnis) für jedes darunter‐
liegende Verzeichnis ausgeführt. Wenn kein Verzeichnis nach der /R‐Option angegeben ist, wird das aktuelle Verzeichnis verwendet. Wenn der Satz nur einen einzelnen Punkt als Zeichen (.) enthält, wird nur die Verzeichnis‐
struktur aufgelistet. FOR /L %Variable IN (Start,Schritt,Ende) DO Befehl [Parameter] Der Satz ist eine Folge von Zahlen von Start bis Ende und der angegebenen Schrittweite. So erzeugt (1,1,5) die Folge 1 2 3 4 5 und (5,‐1,1) erzeugt die Folge (5 4 3 2 1) Î Downto. D:\Dokumente und Einstellungen\Munz\Desktop\Kommunikationstechnik\Praktikum_Kommunikation\Batch&Co\For.doc
3
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Das hatten wir ganz Anfang im Unterricht behandelt: Pseudocode FOR laufvariable:=anfangswert TO endwert STEP schrittweite DO anweisungsfolge END DO Die Zählschleife ist ein Spezialfall des verallgemeinerten Zyklus: laufvariable := anfangswert LOOP WHEN laufvariable > endwert THEN EXIT anweisungsfolge laufvariable := laufvariable + schrittweite END LOOP Wir schauten uns kurz das alte Standard Pascal an Pascal lässt als Schrittweite nur 1 bzw. ‐1 zu. Werden größere Schrittweiten gebraucht, so muss dies der Programmierer selbst organisieren. Abb.1 Syntaxdiagramm (Eisenbahndiagramm) (:= steht für „wird“ = Zuweisungsoperator) In JAVA ist das nichts anderes: Syntax: for (Initialisierung; Schleifenbedingung; Inkrement) Anweisung; Beispiel int anzahl=20; for ( int zahl=1; zahl <= anzahl; zahl++) System.out.println(zahl); Programmablauf (1) Führe Initialisierung aus (2) Prüfe Schleifenbedingung. Ist sie wahr, führe die Anweisung aus; erhöhe dann den Schleifenzähler zahl um 1 (3) Wiederhole Punkt 2, bis die Bedingung falsch ist Man beachte: Der Gültigkeitsbereeich der Variablen zahl ist die Schleife! D:\Dokumente und Einstellungen\Munz\Desktop\Kommunikationstechnik\Praktikum_Kommunikation\Batch&Co\For.doc
4
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Zurück zum Scripting: Bsp.: Îdirekt in der Command Shell FOR /F ["Optionen"] %Variable IN (Dateiensatz) DO Befehl [Parameter] FOR /F ["Optionen"] %Variable IN ("Zeichenkette") DO Befehl [Parameter] FOR /F ["Optionen"] %Variable IN (Befehl) DO Befehl [Parameter] oder, unter Verwendung der Option "usebackq": FOR /F ["Optionen"] %variable IN (Dateiensatz) DO Befehl [Parameter] FOR /F ["Optionen"] %variable IN ('Zeichenkette') DO Befehl [Parameter] FOR /F ["Optionen"] %variable IN (`Befehl`) DO Befehl [Parameter] Der Dateiensatz besteht aus einem oder mehreren Dateinamen. Jede Datei wird geöffnet, gelesen und bearbeitet, dann wird mit der nächsten Datei des Satzes fortgefahren. Die Bearbeitung einer Datei erfolgt zeilenweise, jede einzelne Textzeile wird ausgewertet und in die entsprechenden Token (keinen oder mehrere) zerlegt. Die Befehle in der FOR‐Schleife werden dann mit den Variablenwerten (d.h. den gefunden Zeichenketten bzw. Token) aufgerufen. Standardmäßig liefert /F den ersten, durch ein Leerzeichen getrennten Token von jeder Zeile in jeder Datei. Leerzeilen werden übersprungen. Das standardmäßige Verhalten bei der Analyse kann wahlweise durch den Parameter "Optionen" überschrieben werden. Das ist eine Zeichenkette in Anführungs‐zeichen, welche eines oder mehrere Schlüsselwörter enthält, um verschiedene Parameter für die Analyse anzugeben. Diese Schlüsselwörter sind: eol=c ‐ Gibt das Zeichen für Zeilenendekommentare an (nur eins). skip=n ‐ Gibt die Anzahl der Zeilen an, die am Anfang einer Datei übersprungen werden. delims=xxx ‐ Gibt einen Satz von Trennzeichen an. Diese ersetzen die Standardtrennzeichen TAB und Leerzeichen. tokens=x,y,m‐n ‐ Gibt an, welche Token von jeder Zeile an die FOR‐Schleife weitergegeben werden. Das führt dazu, dass zusätzliche Variablen erzeugt werden. Mit der Form m‐n wird dabei ein Bereich vom m‐ten bis zum n‐ten Token angegeben. Wenn das letzte Zeichen (Token) ein Sternchen ist, wird eine zusätzliche Variable deklariert, die den verbleibenden Text dieser Zeile enthält. usebackq ‐ Gibt an, dass die neue Semantik in Kraft ist, D:\Dokumente und Einstellungen\Munz\Desktop\Kommunikationstechnik\Praktikum_Kommunikation\Batch&Co\For.doc
5
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
wobei eine Zeichenkette in umgekehrten Anführungs‐ zeichen als Befehl ausgeführt wird und eine Zeichenkette in Anführungszeichen ein literaler Befehl ist, der die Verwendung von doppelten Anführungszeichen um Dateinamen in Dateinamens‐ sätzen erlaubt. Einige Beispiele: FOR /F "eol=; tokens=2,3* delims=, " %i in (Datei.txt) do @echo %i %j %k Dadurch wird jede Zeile in der Datei Datei.txt ausgewertet, Zeilen die mit einem Semikolon beginnen werden ignoriert, für den 2. und 3. Token jeder Zeile werden die Befehle in der FOR‐Schleife ausgeführt. Trennzeichen sind Kommas und/oder Leerzeichen. In der FOR‐Schleife wird der Ausdruck %i verwendet, um den 2. Token zu erhalten, %j für den 3. Token und %k, um alle übrigen Token zu erhalten. Dateinamen, die Leerzeichen enthalten, müssen Sie innerhalb doppelter Anführungszeichen angeben. Dazu müssen Sie die Option "usebackq" verwenden. Andernfalls werden doppelte Anführungszeichen zur Definition eines auszuwertenden Literals verwendet. Dabei ist %i explizit deklariert, während %j und %k implizit durch die Option "tokens=" deklariert werden. Sie können bis zu 26 Token durch diese Option angeben, vorausgesetzt, es wird dadurch nicht versucht, eine Variable mit einem Buchstaben größer als 'z' zu deklarieren. Bedachten Sie, dass FOR‐Variablen aus nur einem Buchstaben bestehen, Groß‐/Kleinschreibung beachtet werden muss, dass sie global sind und nicht mehr als insgesamt 52 gleichzeitig aktiv sein dürfen. Sie können den Befehl FOR /F auch direkt mit einer Zeichenkette verwenden, indem Sie die Zeichenkette in doppelten Anführungszeichen als Dateiensatz zwischen den Klammern angeben. Diese Zeichenkette wird dabei als einzelne Zeile einer Datei betrachtet und ausgewertet. Schließlich können Sie den Befehl FOR /F auch verwenden, um die Ausgabe eines Befehls auszuwerten. Dazu geben Sie eine Zeichenkette in einfachen Anführungszeichen als Dateiensatz zwischen den Klammern an. Diese Zeichenkette wird dabei als Befehlszeile betrachtet und von einer unter geordneten CMD.EXE ausgeführt. Die Ausgabe dieses Befehls wird dann wie eine normale Datei ausgewertet. Das folgende Beispiel listet die Um‐ gebungsvariablen im aktuellen Verzeichnis auf: FOR /F " usebackq delims==" %i IN ((`set`) DO @echo %i Zusätzlich wurde die Ersetzung von Verweisen auf FOR‐Variablen erweitert. Sie können jetzt folgende Syntax verwenden: %~I ‐ Expandiert %I und entfernt alle umschließenden Anführungszeichen ("). %~fI ‐ Expandiert %I zu einem vollständigen Dateinamen. %~dI ‐ Erzeugt nur den Laufwerkbuchstaben von %I. %~pI ‐ Erzeugt nur den Pfad von %I. %~nI ‐ Erzeugt nur den Dateinamen von %I. %~xI ‐ Erzeugt nur die Dateierweiterung von %I. %~sI ‐ Erzeugter Pfad enthält nur kurze Dateinamen. %~aI ‐ Erzeugt die Dateiattribute von %I. %~tI ‐ Erzeugt Datum und Zeit von %I. %~zI ‐ Erzeugt die Dateigröße von %I. D:\Dokumente und Einstellungen\Munz\Desktop\Kommunikationstechnik\Praktikum_Kommunikation\Batch&Co\For.doc
6
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
%~$PATH:I ‐ Durchsucht die in der PATH‐Umgebungsvariablen angegebenen Verzeichnisse und expandiert die erste gefundene Datei %I zu dem vollständigen Dateinamen. Wenn der Name der Umgebungsvariablen nicht definiert ist oder diese Datei bei der Suche nicht gefunden wurde, wird dieser Parameter zu einer leeren Zeichenkette expandiert. Diese Parameter können auch miteinander kombiniert werden: %~dpI ‐ Erzeugt den Laufwerkbuchstaben und Pfad von %I. %~nxI ‐ Erzeugt den Dateinamen und die Dateierweiterung von %I. %~fsI ‐ Expandiert %I zu einem vollständigen Namen, der nur kurze Dateinamen enthält. %~dp$PATH:I ‐ Durchsucht die in der PATH‐Umgebungsvariablen angegebenen Verzeichnisse nach %I und erzeugt den Laufwerkbuchstaben und Pfad der ersten gefundenen Datei. %~ftzaI ‐ Expandiert %I zu einer Zeile, die der Ausgabe des DIR‐ Befehls entspricht. In den angegebenen Beispielen können %I und PATH durch andere gültige Werte ersetzt werden. Der Ausdruck %~ wird durch einen gültigen Variablennamen für FOR abgeschlossen. Die Verwendung von Großbuchstaben für die Namen von Variablen, wie z.B. %I, macht diese Ausdrücke leichter lesbar und vermeidet Verwechslungen mit den eigentlichen Parametern. D:\Dokumente und Einstellungen\Munz\Desktop\Kommunikationstechnik\Praktikum_Kommunikation\Batch&Co\For.doc
7
AK-Automatisierungs und Kommunikationstechnik – TI – Technische Informatik
NWT – Netzwerktechnik – www.munz-udo.de
Anhang: Problem: Die erweiterten Funktionen von CMD.EXE unter Windows 2000 und XP sind in manchen Fällen durch Inkompatibilität zum DOS‐Vorgänger COMMAND.COM erkauft. Dadurch funktionieren manchmal ältere Batchdateien nicht mehr korrekt. Lösung: Wenn Sie Probleme beim Ausführen alter Batchdateien feststellen, können Sie die Befehlserweiterungen auch abschalten. CMD.EXE verhält sich dann wie unter Windows NT 4. Mit dem folgenden Kommando starten Sie eine Eingabeaufforderung ohne die Befehlserweiterungen: cmd /e:off Sollen die Befehlserweiterungen generell deaktiviert sein, sobald Sie eine Eingabeaufforderung öffnen, hilft ein Registry‐Eintrag: Î Vorsicht Vorsicht Î langsam und überlegt arbeiten. Öffnen Sie den Registry‐Editor, und gehen Sie zum Schlüssel "Hkey_Current_User\Software\ Microsoft\Command Processor". Hier legen Sie im Wertefenster rechts den DWORD‐Wert "EnableExtensions" an, falls er noch nicht vorhanden ist, und geben ihm den Wert "0". Wenn Sie diesen Wert analog unter "Hkey_Local_Machine\Software \Microsoft\Command Processor" erstellen, sind die Befehlserweiterungen für alle Benutzer des Rechners standardmäßig abgeschaltet. Sie können sie für ein einzelnes Fenster wieder aktivieren, indem sie das Kommando "cmd /e:on" verwenden. Beispielhaft für das Potenzial der Befehlserweiterungen ist der FOR‐Befehl, mit dessen Hilfe Sie Befehle über mehrere Dateien in einer Schleife ausführen können. Es stehen Ihnen hier neue Möglichkeiten zur Verfügung, die oft bequemer sind als aufwendigere Techniken wie VB‐Script (s. Anfangsbeispiele). So kennt der FOR‐Befehl mehrere zusätzliche Parameter: /a Î gelesen slash a ist ein sog. Schalter für den Befehl. Mit /d stellen Sie sicher, dass statt Dateien nur Verzeichnisse verarbeitet werden. Wollen Sie etwa den Inhalt aller Verzeichnisse anzeigen lassen, die "BAK" als Namensbestandteil enthalten, heißt der entsprechende Befehl for /d %i in (*bak*) do dir %i Mit dem Parameter /r durchsucht der FOR‐Befehl auch Unterverzeichnisse. Auf das obige Beispiel angewendet, findet folgender Befehl auch alle Unterverzeichnisse, die ein "BAK" enthalten: for /d /r %i in (*bak*) do dir %i Der FOR‐Befehl kann mit aktivierten Befehlserweiterungen auch unabhängig von Dateinamen zur Schleifenabarbeitung genutzt werden. Dazu dient der Parameter /L, gefolgt von einer Klammer der Form "(&#60;Start &#62;, &#60;Schrittweite &#62;, &#60;Ende &#62;)", die drei Zahlen enthalten muss. So erzeugt eine Klammer "(1, 1, 5)" die Werte 1,2, 3, 4 und 5, die beim Schleifendurchlauf jeweils der Variablen zugewiesen werden. Der folgende Befehl gibt die Zahlen eins bis fünf aus: for /L %i in (1, 1, 5) do echo %i D:\Dokumente und Einstellungen\Munz\Desktop\Kommunikationstechnik\Praktikum_Kommunikation\Batch&Co\For.doc
8