raidman
Goto Top

In batch erfolgreiches entpacken prüfen

Hallo Kenner und Könner

ich suche nach einem Möglichkeit wie ich das erfolgreiche entpacken von zip oder rar Dateien in einer batch prüfen kann, damit danach gefahrlos die Archivdatein gelöscht werden können.
Das entpacken selbst funktioniert mit folgendem Code prima

if exist %3%1\*.rar (
cd %3%1
c:\tools\WinRAR\UnRAR.exe x -p"xxxx" *.rar *.* %2%1\
c:\tools\WinRAR\UnRAR.exe x -p"xxxxxxxx" *.rar *.* %2%1\
)
if exist %3%1\*.zip (
md %2%1
cd %3%1
c:\tools\7z4cmd\7za.exe x -o%2%1\ *.zip
)


ich würde nur auch noch gleich die Archive löschen wollen

mit ERRORLEVEL komm ich nicht weiter ....
weil 0 gibt es auch wen abgebrochen wurde zB

hat da jemand eine Idee?

und schonmal Danke fürs lesen

Content-Key: 211034

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

Printed on: April 18, 2024 at 15:04 o'clock

Member: colinardo
colinardo Jul 10, 2013 updated at 10:12:50 (UTC)
Goto Top
Hallo RaidMan,
der Errorlevel scheint deshalb nicht korrekt zu sein weil du innerhalb von Klammern für den Errorlevel DelayedExpansion benutzen musst.

setlocal ENABLEDELAYEDEXPANSION
die Abfrage des ErrorLevels erfolgt dann direkt nach dem Entpackbefehl von 7Zip so
if !ERRORLEVEL! GTR 0 goto ERROR
Grüße Uwe
gelöste Beitrage bitte auch als solche markieren.Danke
Member: RaidMan
RaidMan Jul 10, 2013 at 10:59:39 (UTC)
Goto Top
hi Uwe


dein Vorschlag funktioniert schonmal gut face-smile

mir war setlocal ENABLEDELAYEDEXPANSION nicht bekannt
kannst du das in Küze erklären?

if !ERRORLEVEL! GTR 0 goto ERROR
dann wäre
if !ERRORLEVEL! EQU 0 del *.rar
der logische nächste Befehl in der batch?
Member: Snowman25
Snowman25 Jul 10, 2013 updated at 11:05:13 (UTC)
Goto Top
Zitat von @RaidMan:
if !ERRORLEVEL! GTR 0 goto ERROR
dann wäre
if !ERRORLEVEL! EQU 0 del *.rar
der logische nächste Befehl in der batch?

Hallo @RaidMan,

ein einfaches del *.rar reicht aus. Deine Batch springt zum ERROR-Label (Welches du am Ende der Batch definieren solltest), falls der Errorlevel über 0 liegt. Deshalb wird diese Zeile nur erreicht, wenn der Errorlevel 0 oder negativ war.
Mehr dazu: if /?

Gruß,
@Snowman25
Member: RaidMan
RaidMan Jul 10, 2013 updated at 11:10:14 (UTC)
Goto Top
Hi Snowman

hm ich war jetzt der Meinung ERRORLEVEL=0 bedeutet Program erfolgreich beendet,
also in diesem Fall erfolgreich entpackt?


RaidMan
Member: colinardo
colinardo Jul 10, 2013 at 11:12:11 (UTC)
Goto Top
mir war setlocal ENABLEDELAYEDEXPANSION nicht bekannt
kannst du das in Küze erklären?
http://ss64.com/nt/delayedexpansion.html

Das sind die Rückgabewerte von 7Zip:
Code / Meaning
0 / No error
1 / Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed.
2 / Fatal error
3 / change identified (does this indicate a change in the archive file itself or a difference when comparing archive file contents to the original source?)
7 / Command line error
8 / Not enough memory for operation
255 / User stopped the process
Member: Snowman25
Snowman25 Jul 10, 2013 at 11:20:43 (UTC)
Goto Top
Ja, das stimmt auch. Und wenn du davor alles umleitest, was NICHT 0 ist, dann wird die Zeile unter dem ERRORLEVEL-Check nur bei ErrorLevel 0 ausgeführt.
Member: RaidMan
RaidMan Jul 10, 2013 at 11:30:52 (UTC)
Goto Top
ersteinmal Danke euch Beiden

das mit dem ERRORLEVEL ist jetzt klar und somit ist die Eingangsfrage beantwortet

und für "ENABLEDELAYEDEXPANSION" muss ich jetzt mal lesen

Danke
Member: bastla
bastla Jul 10, 2013 at 13:06:39 (UTC)
Goto Top
@ colinardo

Grüße
bastla
Member: RaidMan
RaidMan Jul 10, 2013 updated at 13:48:03 (UTC)
Goto Top
hi bastla,
du sprichst zwar direkt colinardo an, ABER mich interessierts aber natürlich auch face-smile
nur kann ich deine Vorschläge nicht direkt umsetzen, face-sad
also wie müsste denn nach deiner Version der folgende Code geändert werden

@echo off
setlocal ENABLEDELAYEDEXPANSION

if exist %3%1\*.rar (
cd %3%1
c:\tools\WinRAR\UnRAR.exe x -pxxxx *.rar *.* %2%1\
if !ERRORLEVEL! GTR 0 goto next1
if !ERRORLEVEL! EQU 0 (
del *.rar
goto ende
)
:next1
c:\tools\WinRAR\UnRAR.exe x -pxxxxxxx *.rar *.* %2%1\
if !ERRORLEVEL! GTR 0 goto next2
if !ERRORLEVEL! EQU 0 (
del *.rar
goto ende
)
:next2
c:\tools\WinRAR\UnRAR.exe x -pxxxxxxxxxx *.rar *.* %2%1\
if !ERRORLEVEL! GTR 0 goto ERROR
if !ERRORLEVEL! EQU 0 (
del *.rar
goto ende
)
)

if exist %3%1\*.zip (
md %2%1
cd %3%1
c:\tools\7z4cmd\7za x -o%2%1\ *.zip
if !ERRORLEVEL! GTR 0 goto ERROR
if !ERRORLEVEL! EQU 0 (
del *.zip
goto ende
)
)

:ERROR
echo ===================================================
echo.
echo ein Feeeeeeeeehler ist beim entpacken aufgetreten
echo.
echo ===================================================
pause

:ende
echo ===================================================
echo.
echo alles ist gut.... Dateien nach %2%1\ entpackt
echo.
echo ===================================================

pause
Member: bastla
bastla Jul 10, 2013 updated at 17:05:45 (UTC)
Goto Top
Hallo RaidMan!

Sollte eigentlich so genügen (ungetestet):
@echo off & setlocal 

if exist %3%1\*.rar (
    cd /d %3%1 2>nul || (echo Pfad %3%1 nicht gefunden! & echo\ & goto :ERROR)
    c:\tools\WinRAR\UnRAR.exe x -pxxxx *.rar *.* %2%1\ && (del *.rar & goto :ende)
    c:\tools\WinRAR\UnRAR.exe x -pxxxxxxx *.rar *.* %2%1\ && (del *.rar & goto :ende)
    c:\tools\WinRAR\UnRAR.exe x -pxxxxxxxxxx *.rar *.* %2%1\ && (del *.rar & goto :ende)
)

if exist %3%1\*.zip (
    md %2%1 2>nul || (echo Pfad %2%1 konnte nicht erstellt werden! & echo\ & goto :ERROR)
    cd /d %3%1 2>nul || (echo Pfad %3%1 nicht gefunden! & echo\ & goto :ERROR)
    c:\tools\7z4cmd\7za x -o%2%1\ *.zip && (del *.zip & goto :ende)
)

:ERROR
echo ===================================================
echo.
echo ein Feeeeeeeeehler ist beim entpacken aufgetreten
echo.
echo ===================================================
pause

:ende
echo ===================================================
echo.
echo alles ist gut.... Dateien nach %2%1\ entpackt
echo.
echo ===================================================

pause
Grüße
bastla
Member: Biber
Biber Jul 10, 2013 updated at 18:13:11 (UTC)
Goto Top
Moin RaidMan,

Ich würde -auch ungetestet - in bastlas Skizze zwischen die beiden Blöcke :ERROR und :ENDE noch eine Zeile setzen. Bzw. als neue Zeile 23 schreiben:
goto :eof

"Goto :eof" benötigt KEINE Sprungmarke namens ":eof", sondern wird interpretiert als "Gehe zum übergeordneten Aufrufer" - wenn es keinen gibt, dann beende die Bachdatei.

Sonst hättest du bei Fehlern den verwirrenden Effekt, dass zuerst die "Feeeeeeeeehler"-Meldung kommt und nach dem Any-Key-Finden kommt dann :"alles bleibt gut ... Dateien nach dev/null/ entpackt" oder ähnlich.

Da bist du dann nur lästigen Fragen ausgesetzt.

Grüße
Biber
Member: RaidMan
RaidMan Jul 11, 2013 updated at 09:09:10 (UTC)
Goto Top
Hi face-smile

der bastla hat meinen schönen batch code ja total eingedampft :O

kurz und bündig so liebe ich es...
aber ich bin wohl nicht auf dem laufenden, das mit den vielen "&" versteh ich nicht so recht
und etwas was an eine ERRORLEVEL Abfrage erinnert erkenn ich auch nicht mehr ?

uhhhh wer hilft mir da mal das zu verstehen bitte

es soll auf jeden Fall verhindert werden, das eine Archivdatei gelöscht wird die nicht wirklich komplett entpackt wurde

ein ratsuchender
RaidMan
Member: bastla
bastla Jul 11, 2013 updated at 09:37:30 (UTC)
Goto Top
Hallo RaidMan!
das mit den vielen "&" versteh ich nicht so recht
und etwas was an eine ERRORLEVEL Abfrage erinnert erkenn ich auch nicht mehr ?
Du kannst natürlich, um einen Errorlevel abzufragen, entweder die Variable "%errorlevel%" (oder mit "delayedExpansion" eben "!errorlevel!") verwenden - wenn es Dir aber genügt, zwischen "beendet mit Errorlevel 0" oder "beendet mit Errorlevel <> 0" zu unterscheiden, lässt sich das einfach mit
Anweisung && echo Anweisung wurde mit Errorlevel 0 beendet || echo Anweisung endete mit einem Errorlevel <> 0
realisieren - bei Bedarf auch mehrzeilig:
Anweisung && (
    echo Anweisung wurde mit Errorlevel 0 beendet
    echo weitere Arbeitsschritte
) || (
    echo Anweisung endete mit einem Errorlevel <> 0
    echo weitere Arbeitsschritte
)
- siehe dazu unter "Using multiple commands and conditional processing symbols".

Die dritte Möglichkeit sei der Vollständigkeit halber auch nochmals erwähnt:
Anweisung
if errorlevel 1 (
    echo Anweisung endete mit einem Errorlevel <> 0
    echo weitere Arbeitsschritte
) else (
    echo Anweisung wurde mit Errorlevel 0 beendet
    echo weitere Arbeitsschritte
)
Damit lassen sich auch verschiedene Errorlevel unterscheiden:
Anweisung
if errorlevel 2 (
    echo Anweisung endete mit einem Errorlevel >= 2
    echo weitere Arbeitsschritte
    goto :eof
)
if errorlevel 1 (
    echo Anweisung endete mit Errorlevel 1
    echo weitere Arbeitsschritte
    goto :eof
)
echo Anweisung wurde mit Errorlevel 0 beendet
echo weitere Arbeitsschritte
Bitte beachten: Es wird so immer auf "Errorlevel >= Vergleichswert" abgefragt, daher immer in absteigender Reihenfolge verwenden.

Ein
if errorlevel 0
ist natürlich überhaupt sinnlos ...

Grüße
bastla
Member: RaidMan
RaidMan Jul 11, 2013 updated at 09:56:15 (UTC)
Goto Top
Hi bastla und Biber

das nenn ich mal eine ausführliche und sachliche Antwort
werd ich gleich mal abarbeiten ...

allerbesten Dank dafür

RaidMan