「已解决」请问*.bat批处理文件如何改成窗口交互式?

下列代码只能将视频拖到bat文件上才能运行,运行完毕没有成功/失败、以及结果文件路径的提示。
我尝试用手上的脚本改了几个小时也不管用。在网上找的一些暂停命令加进去也没效果。

有朋友可以把下列代码做成双击打开窗口-文件拖放到窗口后直行-返回结果 成功或失败,并提示文件保存在源文件同路径下-按任意键退出窗口。
先谢过了!

@echo off
REM 功能:一键无损重新封装为 mp4
REM 作者:neverno
REM 备注:暂时只支持FLV以及F4V和MKV格式
REM 版本历史:
REM 0.1 发布
REM 0.2 增加支持F4V

REM 请无视下面的内容
REM echo %~n1%~x1
REM echo %~1
REM echo %~dp0
REM echo %~dpn1
REM ping -n 10 127.0.0.1 > nul 可当作 wait
REM 请无视上面的内容

title 一键无损重新封装为 mp4

cd /D "%~dp0"
for %%F in (%*) do call :main %%F
goto :eof

:main
setlocal
if /I "%~x1"==".flv" set flag=1
if /I "%~x1"==".f4v" set flag=1
if /I "%~x1"==".mkv" set flag=1
if defined flag (
	ffmpeg.exe -i "%~1" -vcodec copy -acodec copy "%~dpn1".mp4
	goto :eof
)
if not defined flag (
	echo ===
	echo === 文件名: %~n1%~x1
	echo === 错误原因:格式不支持
	echo ===
	pause
)
ENDLOCAL
goto :eof

我之前参考下列代码改的,但没有成功,这个代码的交互性就非常好。

@echo off
title YouTube 音视频合并 20140127
echo 作者:Crexyer
echo 网站:http://www.crexyer.com/
echo.
set /p audio=请将【音频】文件拖拽到此处,按下回车确认:
set /p video=请将【视频】文件拖拽到此处,按下回车确认后,到H盘根目录查找
ffmpeg.exe -i %audio% -i %video% -acodec copy -vcodec copy H:\output.mp4
echo.
echo 合并结束!
echo 文件已经输出到 H:\output.mp4
pause

感谢 VIctoryRoad,第一个回答并附上了分解思路。可惜的是我测试代码运行出现了错误,错误在留言里。

感谢 dog,第二个提供了方案,圆满解决了问题。

不知道为什么,湖北电信访问这个论坛,今天凌晨和发帖前后一小时,非常的卡,必须用魔法才能比较顺畅的打开。

帖子写了两遍才顺利发出去。。。。

不知道这个是否符合您的要求:

@echo off

set /p FILE=请拖拽文件到此处并按回车:

if /I "%FILE:~-4,-1%"=="flv" set flag=1
if /I "%FILE:~-4,-1%"=="f4v" set flag=1
if /I "%FILE:~-4,-1%"=="mkv" set flag=1

if /I "%FILE:~-4,-1%"==".fl" set flag=2
if /I "%FILE:~-4,-1%"==".f4" set flag=2
if /I "%FILE:~-4,-1%"==".mk" set flag=2

if "%flag%"=="1" (
    ffmpeg.exe -i "%FILE%" -vcodec copy -acodec copy "%FILE:~1,-4%mp4"
    if %ERRORLEVEL% NEQ 0 (
        color 0C
        echo 发生错误!
    )
    if %ERRORLEVEL%==0 (
        echo 操作完成!
    )
    pause
)
if "%flag%"=="2" (
    ffmpeg.exe -i "%FILE%" -vcodec copy -acodec copy "%FILE:~0,-4%.mp4"
    if %ERRORLEVEL% NEQ 0 (
        color 0C
        echo 发生错误!
    )
    if %ERRORLEVEL%==0 (
        echo 操作完成!
    )
    pause
)
if not defined flag (
    color 0C
    echo ===
    echo === 文件名: %FILE%
    echo === 错误原因:格式不支持
    echo ===
    pause
)

其中,

  • set /p %FILE%="..." 可将拖拽进窗口中的文件的路径保存到变量 %FILE% 中。参考资料:https://zhuanlan.zhihu.com/p/421422830
    • %FILE:~-4,-1% 截取文件完整路径的最后三个字符,即文件的扩展名。
    • %FILE:~1,-4% 截取文件完整路径中除去最后三个字符之外的内容。如 D:\test.txt 截取后为 D:\test.
  • %ERRORLEVEL% 变量是上一应用程序运行结果的返回代码,0代表没有错误。参考资料:https://www.yiibai.com/batch_script/batch_script_return_code.html
  • color 0C 的作用是当出错时窗口中的文字会变为红色。

好的,你可以尝试使用下面的代码来实现你想要的功能。这个代码将会在你双击打开窗口后,提示你拖放文件到窗口中。当你拖放文件后,程序将会执行并返回结果,成功或失败,并提示文件保存在源文件同路径下。最后,按任意键退出窗口。

@echo off
title 一键无损重新封装为 mp4

cd /D "%~dp0"

:main
echo 请拖放文件到这个窗口中,然后按回车键。
set /p input=""

for %%F in (%input%) do (
	if /I "%%~xF"==".flv" set flag=1
	if /I "%%~xF"==".f4v" set flag=1
	if /I "%%~xF"==".mkv" set flag=1
	if defined flag (
		ffmpeg.exe -i "%%~F" -vcodec copy -acodec copy "%%~dpnF".mp4
		echo ===
		echo === 文件名: %%~nF%%~xF
		echo === 转换成功
		echo === 文件保存在: %%~dpnF.mp4
		echo ===
		set flag=
	) else (
		echo ===
		echo === 文件名: %%~nF%%~xF
		echo === 错误原因:格式不支持
		echo ===
	)
)
pause
goto :eof

希望这个代码能够帮助你实现你想要的功能。如果你有任何问题或者需要进一步的帮助,请随时告诉我。

by bing

1 个赞

你说的交互问题应该是要点echo来提示甚至是要提供选择的吧……

非常感谢您的第一个回复,我刚才测试了一下,会报错。
请拖拽文件到此处并按回车:E:\DeskTop\复原唐装古琴筝竹笛巫毒鼓小打-哆啦A梦之歌(ドラえもんの歌.mkv

=== 文件名: E:\DeskTop\复原唐装古琴筝竹笛巫毒鼓小打-哆啦A梦之歌(ドラえもんの歌.mkv
=== 错误原因:格式不支持

请按任意键继续. . .

非常感谢,您提供的方案圆满解决了问题。

哈哈,其实我完全不懂 :rofl:

好的,谢谢您的提醒!问题出在脚本的第3行。我已经在原帖上做了修改。

这个脚本的问题在于,如果拖入的文件路径中有空格等特殊字符,那么文件路径变量 %FILE% 记录的内容中就会有引号,这时 -4 位到 -1 位的字符串内容是文件的扩展名。比如:

这里先写一个测试用脚本:

set /p FILE=请拖拽文件到此处并按回车:
echo %FILE:~-4,-1%

运行这个脚本,拖入一个文件:

请拖拽文件到此处并按回车:"D:\Program Files\Desktops.exe"
exe

此时,echo %FILE:~-4,-1% 对应的内容是 exe

如果文件路径中没有特殊符号,那么 %FILE% 记录的内容就没有引号,那么此时 %FILE:~-4,-1% 对应的内容就会发生偏移:

请拖拽文件到此处并按回车:D:\Desktops.exe
.ex

那么对于上文提到的第二种情况,可以这样考虑:从倒数第3个字符开始,截取3个字符,即在原脚本第7行后,加上如下几种情况的判断:

if /I "%FILE:~-4,-1%"==".fl" set flag=1
if /I "%FILE:~-4,-1%"==".f4" set flag=1
if /I "%FILE:~-4,-1%"==".mk" set flag=1

好吧,恕本人才疏学浅,这个改法是挺愚蠢的……


我本来想通过截取 %FILE% 的最后4个字符来判断的,但似乎如果截取出的内容中有双引号 ",if 的判断会受到干扰,导致脚本报错退出。比如运行这个脚本:

@echo off
set /p FILE=请拖拽文件到此处并按回车:
echo "%FILE:~-4,4%"
if /I "%FILE:~-4,4%"==".exe" set flag=1

拖入一个文件:

请拖拽文件到此处并按回车:"D:\Program Files\Desktops.exe"
"exe""
命令语法不正确。

已测试,没问题。很感谢!