Пакетный скрипт вызывает собственное имя вместо файлов определенного типа? - PullRequest
0 голосов
/ 26 ноября 2018
cd %cd%
ffmpeg -i %cd%/%04d.png out.mp4

Сценарий, содержащий только это, работает совершенно нормально и выводит именно то, что мне нужно, но:

:: A simple script to convert a png or jpg image sequence to an         
mp4 file with ffmpeg
cls
@echo off
title PNG2MP4
color C
echo Ensure you have ffmpeg installed and setup in your environment variables or this script won't work.


:QUERY
echo This will convert all image files in the following directory to a single mp4, 
echo %cd%
echo are the files PNGs or JPEGs(PNG/P/JPG/J/CANCEL)?
set/p "ch=>"
if /I %ch%==PNG goto CONVERTPNG
if /I %ch%==P goto CONVERTPNG
if /I %ch%==JPG goto CONVERTJPG
if /I %ch%==J goto CONVERTJPG
if /I %ch%==CANCEL goto :eof
echo Invalid choice & goto QUERY

:CONVERTPNG
cd %cd%
ffmpeg -i %cd%/%04d.png out.mp4

:CONVERTJPG
cd %cd%
ffmpeg -i %cd%/%04d.jpg out.mp4

Эта более сложная версия сценария завершается ошибкой, выводя:

C:\tmp/img2mp4.bat4d.jpg: No such file or directory

Почему он больше не вызывает файлы, которые он делал раньше, и есть ли это легко исправить?

1 Ответ

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

Вот мое предложение для пакетного файла:

@echo off
rem A simple script to convert a png or jpg image sequence to an mp4 file with ffmpeg
cls
title PNG2MP4
color C
echo Ensure you have ffmpeg installed and setup in your environment variables
echo or this script won't work.
echo/
echo This will convert all image files in the following directory to a single mp4:
echo/
echo %cd%
echo/
%SystemRoot%\System32\choice.exe /C PJC /N /M "Are the files PNGs or JPEGs or Cancel (P/J/C)? "
if errorlevel 3 color & goto :EOF
echo/
if errorlevel 2 (
    ffmpeg.exe -i %%04d.jpg out.mp4
) else (
    ffmpeg.exe -i %%04d.png out.mp4
)
color

Символ % должен быть экранирован в пакетном файле с еще одним %, чтобы интерпретироваться как литеральный символ, который был главной проблемойв результате чего пакетный файл не работает должным образом.%0 ссылается на строку, использованную для запуска командного файла, которая была img2mp4.bat.Таким образом, %04d.jpg привел к объединению img2mp4.bat с 4d.jpg, и результат выполнялся ffmpeg.exe с img2mp4.bat4d.jpg в качестве имени файла вместо строки аргумента %04d.jpg.

Для ссылки на один или несколько файловПапки / folder в текущей директории могут быть просто указаны в списке аргументов скрипта или приложения без указания пути.Это объясняется в статье Microsoft о Именовании файлов, путей и пространств имен .Далее в этой статье описывается, что в Windows разделителем каталогов является символ обратной косой черты \, а не косая черта /, как в Linux и Mac./ используется в Windows в основном для параметров, поскольку его можно увидеть в строке с командой CHOICE , поскольку этот символ невозможен в именах файлов / папок.- используется в Linux / Mac для параметров, которые также возможны в именах файлов / папок, даже в качестве первого символа имени файла / папки.Поэтому в Windows \ всегда следует использовать в качестве разделителя каталогов, хотя функции ядра Windows для доступа к файловой системе автоматически корректируют / в именах файлов / папок на \.

CHOICE гораздо лучше предложить пользователю сделать выбор из нескольких предложенных опций, чем SET с опцией /P.set/p синтаксически не совсем корректен, поскольку команда set отделена пробелом от опции /P, отделена пробелом от следующего аргумента variable=prompt text.set/p заставляет cmd.exe автоматически исправить командную строку на set /p.Пакетные файлы должны иметь синтаксически правильную кодировку и не зависеть от автоматических исправлений командного процессора Windows.

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

  • call /? ... объясняет, как ссылаться на аргументы пакетного файла.
  • echo /?
  • rem /?
  • cls /?
  • title /?
  • color /?
  • set /?
  • choice /?
  • if /?
  • goto /?

Далее я предлагаю прочитать:

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