Mam plik wsadowy, który przechodzi przez zawartość katalogu i kompresuje pliki w katalogu w następujący sposób;
for %%a in (c:\data\*.*) do if "%%~xa" == "" "C:\Program Files\7-Zip\7za.exe" a -tzip -mx9 "%%a.zip" "%%a"
Widząc, że używam 7zip do kompresji pliku, zwraca komunikat „wszystko jest w porządku”, jeśli pomyślnie skompresował plik, a następnie przechodzi do następnego pliku w dowolnym.
To, co chciałbym zrobić, to:
- Przejdź do następnego pliku tylko wtedy, gdy odpowiedź brzmi „wszystko jest w porządku”
- Jeśli odpowiedzią jest coś innego niż „wszystko jest w porządku”, błąd jest rejestrowany
- Ponieważ wystąpił błąd, próbuje ponownie skompresować plik
- Raz, gdy się powiedzie, tzn. „Wszystko jest w porządku”, przechodzi do następnego pliku
- Kroki 3 i 4 występują maksymalnie 3 razy, zanim się poddają i przejdą do następnego pliku.
Jak mogę to osiągnąć?
if not %errorlevel%==0 (set z_file="%%a" & goto error)
styl, można wykonać dodatkowe komunikaty o błędach, używającgoto try2
,goto lasttry
i używać, aby policzyć liczbę prób. używaniecall batchlabel
może dać możliwość powrotu do miejsca, w którym zostało przerwane&
symbol? Przykłady, które widziałem, wydają się wykorzystywać&&
Rozszerzając odpowiedź Synetech - jest to działający skrypt:
Działa dobrze dla mnie z nieco innymi warunkami (np.
if "%%~xI" == ".txt"
)... i nie sądzę, że użyłem żadnych hacków :)
źródło
call
wprowadzanie etykiety isetlocal ENABLEDELAYEDEXPANSION
funkcje zaawansowane. BTW, dlaczego uważasz, że potrzebujesz opóźnionej ekspansji? - Nie widzę, gdzie jest używany.... in my opinion i didn't use any advanced functions or hacks