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

问题描述 投票:0回答:1
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

为什么它不再调用它以前执行的文件,并且有一个简单的解决方法吗?

batch-file command-line ffmpeg
1个回答
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.jpg导致img2mp4.bat4d.jpg连接,结果运行ffmpeg.exeimg2mp4.bat4d.jpg作为文件名而不是参数字符串%04d.jpg

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

对于提示用户使用选项/P从多个提供的选项中做出选择,CHOICE要好得多。 set/p在语法上根本不正确,因为命令是set,用选项/P中的空格分隔,用下一个参数variable=prompt text中的空格分隔。 set/p迫使cmd.exe自动纠正命令行到set /p。批处理文件应在语法上正确编码,而不依赖于Windows命令处理器的自动更正。

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

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

进一步我建议阅读:

© www.soinside.com 2019 - 2024. All rights reserved.