Pętla Batch FOR nie działa

2

Próbuję więc wykonać procedurę konwersji obrazów w katalogu, ale po prostu w ogóle nie działa i nie widzę, co jest niepoprawne w moim kodzie wsadowym:

FOR /R %a in (*.png) DO (
    files\pngnq -s 1 -n 16 %~fa 
    ren *nq8.png "%~na.png"
    files\gimconv "%~na.png" --format_style psp --format_endian little --pixel_order faster --image_format index4
    del "%~na.png"
    )

błąd, który wyprowadza jest po francusku „nie oczekiwano” (in était inattendu).

EDYCJA: to jest oryginalny (działający kod) kod:

set file=*.png
files\pngnq -s 1 -n 16 %file% 
ren *nq8.png 12345.png
files\gimconv 12345.png --format_style psp --format_endian little --pixel_order faster --image_format index4
del 12345.png
ren *.gim READY4BIT.gim
Omarrrio
źródło

Odpowiedzi:

2

Nie widzę, co jest niepoprawne w moim kodzie wsadowym:

FOR /R %a in (*.png) DO (
    files\pngnq -s 1 -n 16 %~fa 
    ren *nq8.png "%~na.png"
    files\gimconv "%~na.png" --format_style psp --format_endian little --pixel_order faster --image_format index4
    del "%~na.png"
    )

Widzę dwa oczywiste problemy z powyższym kodem:

  1. W pliku wsadowym trzeba wymienić %z %%(w użyciu pliku wsadowego %% a, w cmdużyciu powłoki %a)

  2. Istnieje możliwość, że niektóre pliki mogą zostać przetworzone dwukrotnie, więc powinieneś używać for /frazem z dir).

Mogą również występować inne problemy, ale nie mam wymaganych programów, aby to przetestować.

Zamiast tego użyj następującego pliku wsadowego:

for /f "tokens=*" %%a in ('dir /b *.png') do (
    files\pngnq -s 1 -n 16 %%~fa 
    ren *nq8.png "%%~na.png"
    files\gimconv "%%~na.png" --format_style psp --format_endian little --pixel_order faster --image_format index4
    del "%%~na.png"
    )

Uwaga:

Jest krytyczny , że używasz FOR /F, a nie proste FOR.

FOR /FGromadzi całą wynik DIRpolecenia przed rozpoczęciem iteracji, natomiast prosta FORzaczyna iteracji po bufor wewnętrzny jest pełny, który dodaje ryzyko zmiany nazwy tego samego pliku wielokrotnie.

jak zalecił dbenham w swojej odpowiedzi, aby dodać „tekst” na końcu wielu nazw plików :


Dalsza lektura

DavidPostill
źródło
Dziękuję za wyjaśnienie, ale twój kod działa w połowie, nie przyjmuje nazwy pliku, zajmuje pierwszy wiersz wyniku, który dirdaje objętość dysku D: nazywa się blabla
Omarrrio
1
Ups Mały błąd. Przepraszam. Musimy dodać /bdo dirpolecenia. Odpowiedź zaktualizowana.
DavidPostill
1
To wspaniale! ;)
DavidPostill