我在批处理文件中使用以下命令,双击包含 webm 视频和 m4a 音频文件的文件夹:
for %%a in ("*.webm") do "C:\AVConvert\ffmpeg.exe" -i "%%~fa" -i "%%~na.m4a" -c:v copy -c:a copy -map 0:0 -map 1:0 "%%~na.mkv"
它运行良好,可将 webm 与 m4a 音频合并为一个 mkv 文件。它甚至会自动批量转换同一文件夹中的多个 webm/m4a 文件。现在,我想将批处理文件作为 Windows 资源管理器中媒体文件的右键单击上下文菜单中的多个转换选项之一。
背景:我创建了一组与上述类似的 ffmpeg 批处理文件,用于在各种媒体文件类型之间进行转换或从视频中无损提取音频流(以及其他功能)。为了方便起见,我在媒体文件上下文菜单中将对批处理文件的访问组织在级联上下文菜单项中。
目前,用户单击上下文菜单项时触发的所有批处理文件都具有以下格式:"C:\AVConvert\ffmpeg.exe" -i "%~1" -map_metadata 0 -codec:a pcm_s24le -write_bext 1 "%~d1\%~p1\%~n1.wav"
。批处理文件可以在右键单击媒体文件的任何目录中工作,并且包含用户在触发右键单击转换选项之前选择的文件数量。输出文件夹始终与输入文件夹相同。
所有批处理文件都位于 中C:\AVConvert\Batches
,ffmpeg.exe 位于 中C:\AVConvert\
。各种注册表项使相应的批处理文件在媒体文件上下文菜单中可用。问题是,包含上述循环的批处理文件for
在通过上下文菜单项触发时不起作用。
答案1
您的要求对我来说仍然不清楚,但您应该从以下方面开始:
@echo off
Title Convert *.webm to *.mkv using Batch and ffmpeg
Set "MyFile=%~1"
If "%MyFile%"=="" (
MODE 95,4 & Color 0C & echo(
echo( You should drag and drop any "file.webm" over this batch to be converted into "file.mkv"
Timeout /T 10 /nobreak>nul & exit
)
Set "ffmpeg=C:\ffmpeg\ffmpeg.exe"
Set "MKV_Folder_OutPut=%~dp0MKV_Folder_OutPut"
If Not Exist "%ffmpeg%" color 0C & echo( & echo( "%ffmpeg%" dosen't exists Please check location of this program ! & Timeout /T 10 /Nobreak>nul & EXIT
If Not Exist "%MKV_Folder_OutPut%" MD "%MKV_Folder_OutPut%"
@for %%a in ("*.webm") do "%ffmpeg%" -i "%MyFile%" -c:v copy -c:a copy -map 0:0 "%MKV_Folder_OutPut%\%%~na.mkv"
pause & exit
答案2
Windows注册表不会管理其对象(文件)队列并将它们连接起来,管理向bat文件(cmd.exe)的传递,同时在执行过程中逐一监视所涉及事件的演变。
另一方面,cmd.exe(命令解释器),您将只收到一个包含文件完整路径的字符串,并且在一个参数中......它将指向一个文件,队列中的第一个文件,一行,仅此而已。
按照您一直搜索的方式,最好考虑使用“发送到”,其中选择的多个项目将以另一种方式(具有多重性)作为参数传递......
- 要仅对选定的文件运行(每次运行 1 个),请使用:
@echo off
setlocal EnableExtensions
2>nul cd /d "%~dp1"|| goto :eOf
color 0a & mode 110,3 & title <nul
title ..\FFmpeg 4AVConvertMuxVA ..\%~nx0 & echo\
set "_flags=-c:v copy -c:a copy -map 0:0 -map 1:0 -hide_banner -v error -stats"
if not "%~1" == "" for /f usebackq^tokens^=*delims^= %%i in (`echo\ ^& set /p "'=%1"^<con: ^<nul
`)do if exist "%%~dpni.m4a" "C:\AVConvert\ffmpeg.exe" -i "%%~i" -i "%%~ni.m4a" %_flags% "%%~ni.mkv"
endlocal
- 要对选定文件夹中的所有 mp4 文件运行,请使用:
@echo off
setlocal EnableExtensions
2>nul cd /d "%~dp1"|| goto :eOf
color 0a & mode 110,3 & title <nul
title ..\FFmpeg 4AVConvertMuxVA ..\%~nx0 & echo\
set "_flags=-c:v copy -c:a copy -map 0:0 -map 1:0 -hide_banner -v error -stats"
for /f tokens^=*^delims^= %%i in ('^<con: 2^>nul "%__AppDir__%where.exe" .:*.webm
')do if exist "%%~dpni.m4a" "C:\AVConvert\ffmpeg.exe" -i "%%~i" -i "%%~ni.m4a" %_flags% "%%~ni.mkv"
endlocal
- 带有子菜单的菜单的 Windows 注册表项位于
ContexMenuWsubMenu.Reg
:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\SystemFileAssociations\.webm\Shell\4AVConvertMuxVA]
"MUIVerb"="4AVConvertMuxVA"
"icon"="wmploc.DLL,-1110"
"SubCommands"="Windows.01_M4A;Windows.02_M4A"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.01_M4A]
"MUIVerb"="01_M4A"
"icon"="wmploc.DLL,-1110"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.02_M4A]
"MUIVerb"="02_M4A"
"icon"="wmploc.DLL,-1110"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.01_M4A\command]
@="\"C:\\Windows\\System32\\cmd.exe\" /c >con: cd /d \"%W\" && \"C:\\AVConvert\\Batches\\WEBMV+M4AA.bat\" \"%V\""
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.02_M4A\command]
@="\"C:\\Windows\\System32\\cmd.exe\" /c >con: cd /d \"%W\" && \"C:\\AVConvert\\Batches\\WEBMV+M4AA.bat\" \"%V\""
此 %~n1 在 Windows 注册表中不起作用
使用 explorer-highlight 将多个文件导入到单个批处理文件中