sirnoob
Goto Top

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

Content-Key: 337893

Url: https://administrator.de/contentid/337893

Ausgedruckt am: 19.03.2024 um 11:03 Uhr

Mitglied: Pedant
Pedant 16.05.2017 um 12:07:06 Uhr
Goto Top
SirNoob,

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.
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
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:
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 :extrakt mitlaufen
set /a anzahl+=1
oder wenn Du es schon vorm Auspacken wissen möchtest, dann frag die Anzahl vorher ab, beispielsweise so:
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%
Erklärung:
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
Mitglied: SirNoob
SirNoob 16.05.2017 um 18:45:53 Uhr
Goto Top
Zitat von @Pedant:

Deine Beispiele scheinen ungeeigent zu sein.
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:

Äh ja, ich Depp hab das hier falsch reingeschrieben.
Die Dateien haben natürlich die .rar Endung.
Also so sollte das aussehen:

Test1..part1.rar
Test5.-part1.rar

Aber das es bei dir funktioniert (mit deinen Dateinamen) ist schon merkwürdig.
Wahrscheinlich liegt es dann gar nicht an den Sonderzeichen?!

Ich habe mal überprüft bei welcher Datei er genau aussteigt:

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


Ich habe selber nochmal ein bisschen rumprobiert.
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



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 :extrakt mitlaufen
set /a anzahl+=1
oder wenn Du es schon vorm Auspacken wissen möchtest, dann frag die Anzahl vorher ab, beispielsweise so:
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%
Erklärung:
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

Danke werde ich mal probieren.

Gruß
SirNoob
Mitglied: Pedant
Pedant 16.05.2017 um 19:13:42 Uhr
Goto Top
Hallo SirNoob,

Zitat von @SirNoob:
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
Vergiss die schließenden Anführungszeichen nicht oder lass die Öffnenden auch weg.
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

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
Mitglied: SirNoob
SirNoob 16.05.2017 um 19:52:10 Uhr
Goto Top
Hab es mal soweit auskommentiert, den Rest brauch ich ja noch damit es überhaupt funktioniert, oder nicht?!
(bin leider ein absoluter Anfänger was Batch angeht) :

setlocal 

set path="%PROGRAMFILES%\WinRAR\"  
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"   
unrar e %1 
REM popd
REM TIMEOUT 1

Aber selbst hier kommt der Fehler zustande.
Nur wenn ich es eben um *part1.rar erweitere läuft es richtig.
Habe auch mal Liste1 und 2 erstellt sehe da aber keine Unterschiede.

Gruß
SirNoob
Mitglied: Pedant
Pedant 16.05.2017 um 20:28:11 Uhr
Goto Top
Hallo SirNoob,

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
Mitglied: SirNoob
SirNoob 17.05.2017 um 19:31:44 Uhr
Goto Top
Hi,
ich habe mal ein bisschen rumgetestet und rausgefunden das er schon bei dem "dir" Befehl aussteigt,
z.b. bei C:\Temp>dir /b /s *1.rar kommt folgendes:
(Habe auch die Dateinamen auf ".part?" reduziert und da passiert es auch, er stört sich wohl an dem Punkt vor dem part)

C:\Temp\[Test1]\Horizon.chase.pst.file.part5.rar
C:\Temp\[Test1]\Horizon.chase.pst.file.part6.rar
C:\Temp\[Test1]\Horizon.chase.pst.file.part7.rar
C:\Temp\[Test1]\Horizon.chase.pst.file.part1.rar
C:\Temp\[Test2]\.part1.rar
C:\Temp\[Test2]\.part2.rar
C:\Temp\[Test2]\.part3.rar
C:\Temp\[Test2]\.part4.rar
C:\Temp\[Test2]\.part5.rar
C:\Temp\[Test2]\.part6.rar
C:\Temp\[Test2]\.part7.rar

Bei C:\Temp>dir /b /s *2.rar klappt es richtig. Aber warum? Ist da etwas an der Syntax falsch?

C:\Temp\[Test1]\Horizon.chase.pst.file.part2.rar
C:\Temp\[Test2]\.part2.rar

Gruß
SriNoob
Mitglied: Pedant
Lösung Pedant 17.05.2017 um 20:12:11 Uhr
Goto Top
Hallo SirNoob,

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
Mitglied: Pedant
Lösung Pedant 17.05.2017 aktualisiert um 20:45:54 Uhr
Goto Top
Hallo SirNoob,

"(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
Live:
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
Mitglied: SirNoob
SirNoob 21.05.2017 um 06:24:09 Uhr
Goto Top
Hi,

ah wie gemein face-big-smile, auf die Idee bin ich leider nicht gekommen.
Das mit dem Find comand klappt Prima. Vielen Dank.

Gruß
SirNoob