Пакетная обработка файлов один за другим

У меня есть пакетный файл для сжатия файлов PNG. Когда я перетаскиваю несколько файлов в пакет, он начинает обрабатывать их все одновременно. И это становится бесполезным, когда я пробовал с сотнями файлов (конечно)

Основная часть выглядит примерно так (упрощенно)

START "" /W truepng.exe /out "%~n1_out1.png" %1
START "" /W pngwolf.exe --in="%~n1_out1.png" --out="%~n1_out2.png"

Я думаю, что должен решить часть "%1". Я пытаюсь сделать пакет для обработки файлов с блоками из 4 файлов. Думаю о двух разных подходах, и оба в порядке.

1. Будут обработаны первые 4 файла, после чего будут продолжены остальные 4

2. Или он будет запускать максимум 4 экземпляра "pngwolf.exe" одновременно (лучший вариант).

В своих нескольких тестах я начал пытаться использовать логику счетчика %1 %2 %3 %4 после %n... Но даже на этом этапе я застрял и не смог создать систему счетчиков. Не нужно спрашивать, конечно, я новичок в пакетном кодировании. Но даже для того, чтобы быть хорошим дизайнером, похоже, мне нужно больше узнать о пакетной обработке. Спасибо за любой даст руку. Надеюсь, что есть простое решение, которое я могу понять и адаптировать.

Все лучшее


person inovasyon    schedule 15.02.2015    source источник


Ответы (2)


@ECHO OFF
SETLOCAL
SET /a instances=4
:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")
::
:loop
SET "nextfile=%~1"
IF NOT DEFINED nextfile (
 ECHO all done
 DEL "%tempfile%a*" >NUL 2>NUL
 GOTO :eof
)

FOR /L %%a IN (1,1,%instances%) DO (
 IF NOT EXIST "%tempfile%a%%a" (
  >"%tempfile%a%%a" ECHO.
  START "Instance %%a" oneconversion "%~1" "%tempfile%a%%a" %%a
  SHIFT
  GOTO loop
 )
)
timeout /t 1 >NUL
GOTO loop

GOTO :EOF

Где oneconversion.bat находится

@ECHO OFF
SETLOCAL
START "" /W truepng.exe /out "%~n1_out1.png" %1
START "" /W pngwolf.exe --in="%~n1_out1.png" --out="%~n1_out2.png"
DEL "%~2" >NUL 2>NUL
cls
exit

В качестве макета для проверки принципа я использовал oneconversion.bat

@ECHO OFF
SETLOCAL
TITLE Processing %~1
SET /a wait=%~3*6
timeout /t %wait%
DEL "%~2" >NUL 2>NUL
CLS
exit

вот почему предоставляется третий параметр - он нужен только для того, чтобы сделать oneconversion.bat переменной длины.

Операция довольно проста: создать фиктивный временный файл и предположить, что это имя файла + номер доступны в качестве файла флага.

для каждого доступного экземпляра (установленного на 4 - может быть практически любым) проверьте файл флага, если он отсутствует, создайте его и отправьте следующее преобразование, передав требуемое имя файла и имя временного файла. Когда преобразование будет завершено, уничтожьте временный файл.


Изменить, чтобы быть более общительным:

@ECHO OFF
SETLOCAL
SET /a instances=4
:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")
::
:loop
SET "nextfile=%~1"
IF NOT DEFINED nextfile (
 IF EXIST "%tempfile%a" DEL "%tempfile%a"&ECHO All jobs started&GOTO loop
 IF EXIST "%tempfile%a*" GOTO delay
 ECHO all done
 pause
 GOTO :eof
)

FOR /L %%a IN (1,1,%instances%) DO (
 IF NOT EXIST "%tempfile%a%%a" (
  >"%tempfile%a%%a" ECHO.
  START "Instance %%a" oneconversion "%~1" "%tempfile%a%%a" %%a
  SHIFT
  GOTO loop
 )
)
:delay
timeout /t 1 >NUL
GOTO loop

GOTO :EOF

Очень маленькие изменения:

Когда nextfile оказывается равным not defined, все параметры исчерпаны. Найдите временный файл "%tempfile%a" - он не имеет номера экземпляра и был произвольно удален. Если он существует, удалите его и покажите сообщение «все задания запущены» — задания по-прежнему будут выполняться, но больше не будут добавляться, и вернитесь к циклу.

В следующий раз, когда параметры не будут найдены, «%tempfile%a» не будет существовать, поэтому проверьте, существует ли какой-либо "%tempfile%a*", что будет указывать на то, что вспомогательный пакет не завершен. Если такой файл существует, перейдите к delay, подождите секунду и повторите попытку.

Когда все задания будут завершены, отобразите all done и сделайте паузу, чтобы сообщение было прочитано.

Естественно, если вы вставите символ control-g в отображаемое сообщение, прозвучит звуковой сигнал, если вы хотите звуковое оповещение.

person Magoo    schedule 15.02.2015
comment
Принцип доказан! Отлично работает с первой попытки. Я закончил редактирование реального кода (не упрощенного) и механизмов резервного копирования и т. д. Это подход сжатия PNG, который я сделал, возможно, 2000 тестов, чтобы сбалансировать производительность и эффективность. Поделюсь после адаптации. Пакетный файл был последней частью. Спасибо. - person inovasyon; 15.02.2015
comment
Привет; Я хотел бы задать еще один вопрос, если можно. Скрипт работает идеально, я просто хотел бы добавить сообщение END и звук. Я пытался найти конечную точку в основном скрипте, но не смог. Я как-то запутался. Где я могу разместить команду для выполнения в конце? - person inovasyon; 16.02.2015
comment
Я пытаюсь внести изменения в код, но не смог. Надеюсь, вы сможете увидеть пост. stackoverflow.com/questions/31375747/ - person inovasyon; 13.07.2015

Переменная, содержащая все параметры, переданные в скрипт, — %*.

Вы можете обрабатывать по одному, используя цикл for:

for %%A in (%*) do (
    START "" /W truepng.exe /out "%%~nA_out1.png" %%%A
    START "" /W pngwolf.exe --in="%%~nA_out1.png" --out="%%~nA_out2.png"
)


Чтобы одновременно обрабатывать пакеты из четырех файлов, сначала запустите все четыре экземпляра truepng, а затем все четыре экземпляра pngwolf.

:: Process four sets of truepng at once
start "" truepng.exe /out "%~n1_out1.png" %1
start "" truepng.exe /out "%~n2_out1.png" %2
start "" truepng.exe /out "%~n3_out1.png" %3
start "" truepng.exe /out "%~n4_out1.png" %4

:: Wait for 1 second/let the above commands catch up
ping -n 1 1.1.1.1>nul

:: Process four sets of pngwolf at once
start "" pngwolf.exe --in="%~1_out1.png" --out="%~n1_out2.png"
start "" pngwolf.exe --in="%~2_out1.png" --out="%~n2_out2.png"
start "" pngwolf.exe --in="%~3_out1.png" --out="%~n3_out2.png"
start "" pngwolf.exe --in="%~4_out1.png" --out="%~n4_out2.png"
person SomethingDark    schedule 15.02.2015
comment
Спасибо, я попробую. Но есть ли способ изменить его для обработки файлов с 4 экземплярами? Один за другим будет очень медленно. - person inovasyon; 15.02.2015
comment
Если вы удалите флаг /W, вы сможете вызывать truepng и pngwolf с %1, %2, %3 и %4, и они будут работать одновременно. - person SomethingDark; 15.02.2015
comment
Извините, не могу, так как pngwolf использует вывод truepng. И когда я удалил из pngwolf, почти ничего не изменилось, как ожидалось. Но все равно спасибо. - person inovasyon; 15.02.2015
comment
@inavasyon - я добавил код для одновременной обработки нескольких входных данных. - person SomethingDark; 15.02.2015
comment
Я думаю, вы неправильно поняли. В вопросе я упоминал в случае сотен файлов. Вот почему мне нужен пакетный скрипт. Не только 4. И еще одна проблема заключается в том, что время обработки truepng варьируется от нескольких секунд до нескольких минут. Я не могу определить фиксированную задержку. Но еще раз спасибо, чтобы попытаться помочь. - person inovasyon; 15.02.2015