Пакетный файл DOS Для цикла запускается дважды - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть пакетный файл, который рекурсивно кодирует видео в подпапку «кодировать», затем удаляет оригинал и перемещает новый файл в исходный каталог.У меня проблема в том, что после того, как каждое видео закодировано, цикл for выбирает только что закодированное видео и запускается снова.После этого он переходит к следующему видео.Я не уверен, почему это работает дважды, а не один раз или бесконечно.Что я недопонимаю?Я новичок, поэтому приношу свои извинения, если это простая ошибка.

@echo off
set /A count = 0
pushd %~dp0
for /R %%f in (*.mp2, *.mpg, *.vob, *.avi, *.wmv, *.mov, *.mp4, *.m4v, *.mpeg) do (
mkdir %%~dpf\encode
C:\HandBrakeCLI -i "%%f" -o "%%~dpf\encode%%~nf.mp4"
del "%%f"
move "%%~dpf\encode\%%~nf.mp4" %%~dpf
rmdir %%~dpf\encode
set /A count+=1
)
popd
echo Count is: %count%
pause

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я проверил его, чтобы понять, почему он так странно себя ведет, и единственный ответ, который я могу придумать, это то, что он просто странно действует.Я предполагаю, что это зависит от порядка операций.

это мое мнение: в некоторых реализациях кода for / r избегает бесконечного цикла.то, что он делает, запускается на файлы, которые не являются .mp4 в первую очередь.затем, вероятно, потому что он был переименован, он не распознает его как тот же файл.вероятно, после того, как он запускается на .mp4, второй раз, его файловый индекс (за исключением последнего времени, открытого и отредактированного) не должен отличаться по крайней мере от точки, где система больше не будет распознавать его как тот же файл,Я протестировал немного другую версию кода, которая выдает бесконечный цикл:

set /A count = 0
pushd %~dp0
for /R %%f in (*.mp2, *.mpg, *.vob, *.avi, *.wmv, *.mov, *.mp4, *.m4v, *.mpeg) do (
mkdir %%~dpf\encode

move %%f %%~dpf\encode
rename %%~dpf\encode\%%f %%~dpf\encode\%%~nf.mp4

move %%~dpf\encode\%%~nf.mp4 %%~dpf
rmdir %%~dpf\encode
set /A count+=1
)
popd
echo Count is: %count%
pause 

и, как ни странно, он не только запустил бесконечный цикл, но и создал бесконечное количество подпапок с именем '\ encode \кодировать \ кодировать ... ', но причина этого не имеет значения.что отличается в этой версии кода, так это то, что я всегда переименовываю файлы.Вероятно, именно поэтому он создает бесконечный цикл.

Команда for / r повторяет файлы, которые были переименованы, но не обязательно в отредактированных.Похоже, что решение в действительности состоит в том, чтобы сначала запустить код для всех файлов .mp4, а затем - для других.

0 голосов
/ 26 ноября 2018

Причина, по которой он обрабатывается дважды, заключается в том, что при преобразовании файла создается другой видеоклип, который соответствует критериям в цикле FOR.

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

@echo off
set /A count = 0
pushd %~dp0
for /R %%f in (*.mp4) do (
   mkdir %%~dpf\encode
   C:\HandBrakeCLI -i "%%f" -o "%%~dpf\encode%%~nf.mp4"
   del "%%f"
   move "%%~dpf\encode\%%~nf.mp4" %%~dpf
   rmdir %%~dpf\encode
   set /A count+=1
   )
for /R %%f in (*.mp2, *.mpg, *.vob, *.avi, *.wmv, *.mov, *.m4v, *.mpeg) do (
   mkdir %%~dpf\encode
   C:\HandBrakeCLI -i "%%f" -o "%%~dpf\encode%%~nf.mp4"
   del "%%f"
   move "%%~dpf\encode\%%~nf.mp4" %%~dpf
   rmdir %%~dpf\encode
   set /A count+=1
   )
popd
echo Count is: %count%
pause

Не забудьте удалить *.mp4 из списка файлов второго цикла.


Редактировать : Вот более элегантное решение.

@echo off
set /A count = 0
pushd %~dp0
for %%e in (mp4 mp2 mpg vob avi wmv mov m4v mpeg) do (
   for /R %%f in (*.%%e) do (
      mkdir %%~dpf\encode
      C:\HandBrakeCLI -i "%%f" -o "%%~dpf\encode%%~nf.mp4"
      del "%%f"
      move "%%~dpf\encode\%%~nf.mp4" %%~dpf
      rmdir %%~dpf\encode
      set /A count+=1
   )
)
popd
echo Count is: %count%
pause

Убедитесь, что mp4 указан первым, чтобы он не преобразовывался после обработки других типов файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...