批处理脚本调用自己的名称而不是某种类型的文件?

时间:2018-11-26 09:22:14

标签: batch-file command-line ffmpeg

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 :(得分:1)

这是我对批处理文件的建议:

@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.jpgimg2mp4.bat4d.jpg串联在一起,结果正在运行ffmpeg.exe作为文件名而不是参数字符串img2mp4.bat4d.jpg的{​​{1}}。

要引用当前目录中的一个或多个文件/文件夹,可以在没有路径的脚本或应用程序的参数列表中简单地指定文件/文件夹。在Microsoft关于Naming Files, Paths, and Namespaces的文章中对此进行了解释。本文进一步说明,在Windows上,目录分隔符是反斜杠字符%04d.jpg,而不是Linux和Mac上的正斜杠\/在Windows上主要用于选项,因为可以在命令 CHOICE 上看到它,因为在文件/文件夹名称中不可能使用此字符。 /在Linux / Mac上用于选项,这些选项也可以在文件/文件夹名称中使用,甚至可以作为文件/文件夹名称的第一个字符使用。因此,尽管Windows内核用于文件系统访问的功能会自动将文件/文件夹名称中的-纠正为\,但在Windows上/应该始终用作目录分隔符。

与提示选项\ SET 相比,

选择提示用户从多个提供的选项中进行选择要好得多。 /P在语法上根本不正确,因为命令set/p与选项set隔开一个空格,与下一个参数/P隔开一个空格。 variable=prompt text强制set/p自动将命令行更正为cmd.exe。批处理文件应在语法上正确编码,并且不依赖于Windows命令处理器的自动更正。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • set /p ...说明了如何引用批处理文件参数。
  • call /?
  • echo /?
  • rem /?
  • cls /?
  • title /?
  • color /?
  • set /?
  • choice /?
  • if /?

我还建议阅读: