Archive mit Leerzeichen in jeweilige Verzeichnisse entpacken

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
Feuchtbeule
Junior Member
Junior Member
Posts: 15
Joined: 2007-01-21, 01:24 UTC

Archive mit Leerzeichen in jeweilige Verzeichnisse entpacken

Post by *Feuchtbeule »

ich hatte genau das gleiche Problem wie Sirius in diesem Thread --> ghisler.ch/board/viewtopic.php?t=4897

Ich habe das ganze mit 7zip gelöst. (7z.exe dazu direkt in den Windowsordner kopiert)
Jedoch gibt es Probleme sobald Leerzeichen im Ordnernamen oder im Dateinamen enthalten sind. Es wird immer nur bis zum ersten Leerzeichen gelesen.
Gibt es eine Möglichkeit die bat so umzuschreiben, dass der komplette Name mit Leerzeichen eingelesen wird?

Meine bat:

Code: Select all

for /f %%a in ('dir *.zip /s /b') do (cd %%~pa
7z x %%~a
del %%~a
cd ..)
Ich könnte natürlich das Umbenenntool nutzen und alle Leerzeichen durch einen Unterstrich ersetzen, aber das wollte ich erstmal vermeiden...
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

"delims=" sollte Dein Problem lösen, weil damit Windows angewiesen wird, Lerrzeichen nicht mehr als Trennzeichen anzusehen (was es standardmäßig macht).

Code: Select all

for /f %%a  "delims=" in ('dir *.zip /s /b') do (cd %%~pa
7z x %%~a
del %%~a
cd ..)
Sieh Dir ggf. mal die im DOS Fenster die Hilfe zu "for" an, sehr interessant.
Ich habe das als Textfile immer griffbereit auf meiner Festplatte zu liegen:
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 bei Variablen-
namen, %i und %I sind nicht identisch.

Wenn die Befehlserweiterungen aktiviert sind, werden folgende
Ergänzungen für den FOR-Befehl unterstützt:

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 darunterliegende 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 Verzeichnisstruktur 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).

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ührungszeichen, welche eines oder mehrere Schlüssel-
wö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 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,
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. Trenn-
zeichen 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ß-/Klein-
schreibung 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.
%~$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 Variablen-
namen 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.
sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Feuchtbeule
Junior Member
Junior Member
Posts: 15
Joined: 2007-01-21, 01:24 UTC

Post by *Feuchtbeule »

vielen dank für den hinweis, aber delims stand noch an der falschen stelle und beim entpacken und löschen muss der name in " " gesetzt werden damit es klappt ;)
Ausserdem habe ich es noch um 3 weitere archivarten erweitert:

Code: Select all

for /f "delims=" %%a  in ('dir *.zip /s /b') do (cd %%~pa
7z x "%%~a"
del "%%~a"
cd ..)
for /f "delims=" %%a  in ('dir *.rar /s /b') do (cd %%~pa
7z x "%%~a"
del "%%~a"
cd ..)
for /f "delims=" %%a  in ('dir *.ace /s /b') do (cd %%~pa
7z x "%%~a"
del "%%~a"
cd ..)
for /f "delims=" %%a  in ('dir *.7z /s /b') do (cd %%~pa
7z x "%%~a"
del "%%~a"
cd ..)
MfG
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

delims stand noch an der falschen stelle
Jau, war spät den Abend....

Aber Du hast es ja noch herausgefunden.


sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Post Reply