Dateien mit Batch entpacken
Hi Zusammen,
Ich habe hier eine kleine Batchdatei (siehe unten) das einen Ordner bzw. Unterordner nach .rar Dateien durchsucht und diese dann nacheinander entpackt.
Die .rar Archive haben meisten mehrere Parts.
D.h. er such nach *1.rar und entpackt das Ganze dann.
Das klappt auch ganz gut allerdings springt er bei manchen Archiven danach noch zu *2.rar und wiederholt das Ganze.
Ich kann mir das nicht ganz erklären. Ich habe nur rausgefunden, dass dies passiert, wenn Sonderzeichen öfters hintereinander kommen z.b.
Test1..part1
Test5.-part.1
Ich habe mich jetzt schon etwas belesen, komme aber nicht so richtig dahinter warum er dieses Verhalten an den Tag legt. An was könnte das denn liegen?
Oder habe ich im Code einen Fehler gemacht?
Batch:
setlocal
set path="%PROGRAMFILES%\WinRAR\";%path%
for /F "delims=" %%A in ('dir /s/b "*1.rar"') do call :extract "%%~fA"
goto :eof
:extract
echo %1
if Not Exist "%~dpn1" mkdir "%~dpn1"
pushd "%~dpn1"
unrar e %1
popd
TIMEOUT 1
PS: noch eine Zusatz Frage: Wie kann ich zusätzlich überprüfen ob es mehrere Rar Archive sind oder nur eines?
Gruß
SirNoob
Ich habe hier eine kleine Batchdatei (siehe unten) das einen Ordner bzw. Unterordner nach .rar Dateien durchsucht und diese dann nacheinander entpackt.
Die .rar Archive haben meisten mehrere Parts.
D.h. er such nach *1.rar und entpackt das Ganze dann.
Das klappt auch ganz gut allerdings springt er bei manchen Archiven danach noch zu *2.rar und wiederholt das Ganze.
Ich kann mir das nicht ganz erklären. Ich habe nur rausgefunden, dass dies passiert, wenn Sonderzeichen öfters hintereinander kommen z.b.
Test1..part1
Test5.-part.1
Ich habe mich jetzt schon etwas belesen, komme aber nicht so richtig dahinter warum er dieses Verhalten an den Tag legt. An was könnte das denn liegen?
Oder habe ich im Code einen Fehler gemacht?
Batch:
setlocal
set path="%PROGRAMFILES%\WinRAR\";%path%
for /F "delims=" %%A in ('dir /s/b "*1.rar"') do call :extract "%%~fA"
goto :eof
:extract
echo %1
if Not Exist "%~dpn1" mkdir "%~dpn1"
pushd "%~dpn1"
unrar e %1
popd
TIMEOUT 1
PS: noch eine Zusatz Frage: Wie kann ich zusätzlich überprüfen ob es mehrere Rar Archive sind oder nur eines?
Gruß
SirNoob
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 337893
Url: https://administrator.de/forum/dateien-mit-batch-entpacken-337893.html
Ausgedruckt am: 21.04.2025 um 11:04 Uhr
9 Kommentare
Neuester Kommentar
SirNoob,
Bei diesen Dateinamen würde Dein Befehl
Wenn ich die Dateinamen mit
Da ich kein WinRAR habe, habe ich Deinen Code für einen Test etwas reduziert:
Das läuft bei mir ohne Fehler und ohne dass zu "*2.rar" gesprungen und irgendwas unerwünscht wiederholt wird.
Als Dateinamen habe ich diese vier verwendet:
Gibt bitte mal konkrete Beispiele für Dateinnamen bei denen Dein genanntes Problem auftritt.
Falls diese vier tatsächlich schon problematisch sein sollten, liegt der Fehler vermutlich im von mir auskommentierten Teil.
oder wenn Du es schon vorm Auspacken wissen möchtest, dann frag die Anzahl vorher ab, beispielsweise so:
Erklärung:
In der Ausgabe des Dir-Befehls lässt Du nach Zeilen mit der Zeichenfolge "Datei(en)" suchen und bei einem Treffer nutzt die Zahl (Anzahl) die davor steht.
Bei keinem Treffer bleibt
Gruß Frank
Zitat von @SirNoob:
Das klappt auch ganz gut allerdings springt er bei manchen Archiven danach noch zu *2.rar und wiederholt das Ganze.
Ich kann mir das nicht ganz erklären. Ich habe nur rausgefunden, dass dies passiert, wenn Sonderzeichen öfters hintereinander kommen z.b.
Test1..part1
Test5.-part.1
Deine Beispiele scheinen ungeeigent zu sein.Das klappt auch ganz gut allerdings springt er bei manchen Archiven danach noch zu *2.rar und wiederholt das Ganze.
Ich kann mir das nicht ganz erklären. Ich habe nur rausgefunden, dass dies passiert, wenn Sonderzeichen öfters hintereinander kommen z.b.
Test1..part1
Test5.-part.1
Bei diesen Dateinamen würde Dein Befehl
dir /s/b "*1.rar
keine Datei finden.Wenn ich die Dateinamen mit
.rar
ergänze findet er sie, aber wo sind die erwähnten Sonderzeichen und wo ist das Problem?Da ich kein WinRAR habe, habe ich Deinen Code für einen Test etwas reduziert:
@echo off
setlocal
for /F "delims=" %%A in ('dir /s/b "*1.rar"') do call :extract "%%~fA"
goto :eof
:extract
echo %1
REM if Not Exist "%~dpn1" mkdir "%~dpn1"
REM pushd "%~dpn1"
REM unrar e %1
REM popd
REM TIMEOUT 1
Als Dateinamen habe ich diese vier verwendet:
Test1..part1.rar
Test1..part2.rar
Test5.-part.1.rar
Test5.-part.2.rar
Gibt bitte mal konkrete Beispiele für Dateinnamen bei denen Dein genanntes Problem auftritt.
Falls diese vier tatsächlich schon problematisch sein sollten, liegt der Fehler vermutlich im von mir auskommentierten Teil.
Zitat von @SirNoob:
Wie kann ich zusätzlich überprüfen ob es mehrere Rar Archive sind oder nur eines?
Lass einfach eine Zählvariable bei Wie kann ich zusätzlich überprüfen ob es mehrere Rar Archive sind oder nur eines?
:extrakt
mitlaufenset /a anzahl+=1
set /a anzahl=0
for /f "tokens=1" %%f in ('dir /s "*1.rar" ^| find "Datei(en),"') DO set /a anzahl=%%f
echo Anzahl: %anzahl%
dir /s "*1.rar"
gibt die Anzahl der entsprechenden Datei(en) oder Datei nicht gefunden
aus.In der Ausgabe des Dir-Befehls lässt Du nach Zeilen mit der Zeichenfolge "Datei(en)" suchen und bei einem Treffer nutzt die Zahl (Anzahl) die davor steht.
Bei keinem Treffer bleibt
anzahl
auf dem zuvor gesetzten Wert 0.Gruß Frank
Hallo SirNoob,
Da keine Leerzeichen eingeschlossen sind, sind die Anführungszeichen an der Stelle entbehrlich.
Vergleich mal die Ausgabe von
und
und prüf, ob dort schon Merkwürdigkeiten auftreten.
(Ich vermute mal eher nein.)
Es funktioniert auch mit Deinen Dateinamen, aber mit meinem Skript, das einige REM enthält.
Geh doch mal genauso vor:
Kommentier Diverses aus bis es läuft und dann nach und nach wieder alles ein, bis Du siehst wo was schief läuft.
Ein paar zusätzliche
Gruß Frank
Zitat von @SirNoob:
Wenn ich nach
Allerdings ist das nicht wirklich zufriedenstellend das nicht alle Dateien diese "Part?" Endung haben
Vergiss die schließenden Anführungszeichen nicht oder lass die Öffnenden auch weg.Wenn ich nach
dir /s/b "*part1.rar
statt nach dir /s/b "*1.rar
suche läuft der Code auch bei mir problemlos durch?!Allerdings ist das nicht wirklich zufriedenstellend das nicht alle Dateien diese "Part?" Endung haben
Da keine Leerzeichen eingeschlossen sind, sind die Anführungszeichen an der Stelle entbehrlich.
Vergleich mal die Ausgabe von
dir /s/b *part1.rar>Liste1.txt
und
dir /s/b *1.rar>Liste2.txt
und prüf, ob dort schon Merkwürdigkeiten auftreten.
(Ich vermute mal eher nein.)
Zitat von @SirNoob:
Aber das es bei dir funktioniert (mit deinen Dateinamen) ist schon merkwürdig.
Wahrscheinlich liegt es dann gar nicht an den Sonderzeichen?!
...
Horizon.chase.pst.file..part1.rar
Horizon.chase.pst.file..part2.rar
Horizon.chase.pst.file..part3.rar
...
Komisch ist nur dass, "nur" part2.rar wiederholt wird und part3.rar nicht
Aber das es bei dir funktioniert (mit deinen Dateinamen) ist schon merkwürdig.
Wahrscheinlich liegt es dann gar nicht an den Sonderzeichen?!
...
Horizon.chase.pst.file..part1.rar
Horizon.chase.pst.file..part2.rar
Horizon.chase.pst.file..part3.rar
...
Komisch ist nur dass, "nur" part2.rar wiederholt wird und part3.rar nicht
Es funktioniert auch mit Deinen Dateinamen, aber mit meinem Skript, das einige REM enthält.
Geh doch mal genauso vor:
Kommentier Diverses aus bis es läuft und dann nach und nach wieder alles ein, bis Du siehst wo was schief läuft.
Ein paar zusätzliche
echo
oder ein @echo on
an geeigneter Stelle kann bei der Fehlersuche helfen.Gruß Frank
Hallo SirNoob,
Mach aus Zeile 12 auch noch einen Kommentar
Läuft es dann?
Im nächsten Schritt könntest Du aus Zeile 12 das hier machen:
und es mit den beiden Varianten der Zeile 4 laufen lassen
Dann kannst Du die beiden Test.txt vergleichen.
(Die Erste musst Du natürlich wegkopieren oder umbenennen, damit der zweite Testlauf sie nicht überschreibt.)
Steht in beiden Test.txt dasselbe drin, dann wird's komisch.
Du könntest Zeile 12 auch testhalber durch
ersetzen. Das zeigt Dir dann, ob Deine Verzeichniswechselei mit
Generell kannst Du eine Befehlszeile auch statt mit REM mit ECHO "kommentieren".
Dann siehst Du was die Zeile machen würde, wenn sie denn nicht nur ausgegeben sondern ausgeführt würde.
Gruß Frank
Mach aus Zeile 12 auch noch einen Kommentar
REM unrar e %1
Läuft es dann?
Im nächsten Schritt könntest Du aus Zeile 12 das hier machen:
>Test.txt echo unrar e %1
und es mit den beiden Varianten der Zeile 4 laufen lassen
*part1.rar
und *1.rar
Dann kannst Du die beiden Test.txt vergleichen.
(Die Erste musst Du natürlich wegkopieren oder umbenennen, damit der zweite Testlauf sie nicht überschreibt.)
Steht in beiden Test.txt dasselbe drin, dann wird's komisch.
Du könntest Zeile 12 auch testhalber durch
>Test.txt echo %1
ersetzen. Das zeigt Dir dann, ob Deine Verzeichniswechselei mit
pushd
und popd
funktioniert.Generell kannst Du eine Befehlszeile auch statt mit REM mit ECHO "kommentieren".
Dann siehst Du was die Zeile machen würde, wenn sie denn nicht nur ausgegeben sondern ausgeführt würde.
Gruß Frank
Hallo SirNoob,
da bist Du in eine böse Falle getreten.
Führ mal das hier aus:
Dann sollte klar sein, warum Du scheinbar falsche (zuviele) Ergebnisse bekommst.
Richtig sind sie dennoch in der 8.3 Benennung.
Wie man das vermeidet kann ich Dir (noch) nicht sagen.
Gruß Frank
da bist Du in eine böse Falle getreten.
Führ mal das hier aus:
dir /x /s *1.rar
dir /x /s *2.rar
dir /?
Dann sollte klar sein, warum Du scheinbar falsche (zuviele) Ergebnisse bekommst.
Richtig sind sie dennoch in der 8.3 Benennung.
Wie man das vermeidet kann ich Dir (noch) nicht sagen.
Gruß Frank
Hallo SirNoob,
"(noch)" ist vorbei.
Ich habe zwar nicht rausbekommen wie man
Auch wenn
Du könnest also einfach die Ausgabe nochmal filtern, also nur die ausgeben, die auch im langen Namen "1.rar" haben.
Test:
Live:
Sowas wie
Falls nicht müsste man weiter filtern.
Gruß Frank
"(noch)" ist vorbei.
Ich habe zwar nicht rausbekommen wie man
dir
davon abhält auch die kurzen Dateinamen auszuwerten, aber eine andere Lösung ersonnen.Auch wenn
dir
die kurzen Namen anwendet, so zeigt dir /s /b
nur die langen an.Du könnest also einfach die Ausgabe nochmal filtern, also nur die ausgeben, die auch im langen Namen "1.rar" haben.
Test:
for /F "delims=" %%A in ('dir /s/b "*1.rar" ^| find "1.rar"') do echo %%A
for /F "delims=" %%A in ('dir /s/b "*1.rar"') do call :extract "%%~fA"
Sowas wie
Top1.raritaet.part3.rar
wäre dann immernoch ein "false positive", aber das ist vermutlich vertretbar.Falls nicht müsste man weiter filtern.
Gruß Frank