
我正在尝试使用 ESC 代码在脚本中添加文本颜色,以便对文件列表中的视频文件进行批处理。
在下面的代码第 29 行中,ffmpeg 代码导致后期着色被取消。如果我删除 ffmpeg 代码,所有着色都可以正常工作。请问是否有人能看出问题出在哪里。
@echo off
REM Change the console encoding to UTF-8 (for Nordic characters).
chcp 65001
set filelist=%1
setlocal enabledelayedexpansion
REM Define ESC escape character
for /f %%d in ('echo prompt $E ^| cmd') do (set "ESC=%%d")
for /f "usebackq tokens=*" %%a in ("%filelist%") do (
set Bytes=%%~za
set MB=!Bytes:~0,-6!
set Timestamp=%%~ta
set TSYYYY=!Timestamp:~6,4!
set TSYY=!Timestamp:~8,2!
set TSMM=!Timestamp:~3,2!
set TSDD=!Timestamp:~0,2!
set TSHR=!Timestamp:~11,2!
set TSMIN=!Timestamp:~14,2!
set TSDato=!TSYY!!TSMM!!TSDD!
set TSTid=!TSHR!!TSMIN!
echo !ESC![33mConvert and compress !Bytes! Bytes sized %%~xa file to .MP4!ESC![0m
REM Problem area. Below ffmpeg command cancels using ESC color codes. If REMed out, coloring works perfectly.
ffmpeg -hide_banner -loglevel quiet -i "%%~da%%~pa%%~na%%~xa" -vcodec libx265 -crf 28 "%%~da%%~pa%%~na_!TSDato!-!TSTid!.mp4"
REM Clean up. If new file created, delete original file
if exist "%%~da%%~pa%%~na_!TSDato!-!TSTid!.mp4" (del "%%~da%%~pa%%~na%%~xa")
echo !ESC![42mSummary!ESC![0m
echo !ESC![34mInputfile="%%~a"!ESC![0m
echo !ESC![32mOutputfile="%%~da%%~pa%%~na_!TSDato!-!TSTid!.mp4"!ESC![0m
echo !ESC![42mFile "%%~na" optimisation complete!ESC![0m
pause
)
echo.
echo All files optimised!
答案1
@echo off && setlocal enabledelayedexpansion
REM Change the console encoding to UTF-8 (for Nordic characters).
chcp 65001 | echo/
set "_ffflag#2=-vcodec libx265 -crf 28"
set "_ffflag#1=-y -hide_banner -v error -stats -i"
set "_ffmpeg=C:\Program Files\FFmpeg\bin\ffmpeg.exe"
REM Define ESC escape character $E
for /f skip^=4 %%e in =;('
echo;prompt;$E^|cmd.exe
');= do echo/ & set "_$E=%%~e"
for %%a in =;("%~1");= do =;(
set "_Bytes=%%~za"
set "_MB=!_Bytes:~0,-6!"
set "_Timestamp=%%~ta"
set "_TSYYYY=!_Timestamp:~6,4!"
set "_TSYY=!_Timestamp:~8,2!"
set "_TSMM=!_Timestamp:~3,2!"
set "_TSDD=!_Timestamp:~0,2!"
set "_TSHR=!_Timestamp:~11,2!"
set "_TSMIN=!_Timestamp:~14,2!"
set "_TSDato=!_TSYY!!_TSMM!!_TSDD!"
set "_TSTid=!_TSHR!!_TSMIN!"
echo %_$E%[33mConvert and compress !_Bytes! Bytes sized %%~xa file to .MP4%_$E%[0m
REM Problem area. Below ffmpeg command cancels using ESC color codes. If REMed out, coloring works perfectly.
"%ComSpec%" /v:on /e:on /q /s /c ""%_ffmpeg%" %_ffflag#1% "%%~fa" %_ffflag#2% "%%~dpna_!_TSDato!-!_TSTid!.mp4"
chcp 65001 | echo/
REM Clean up. If new file created, delete original file
2>nul del /q "%%~fa"
echo %_$E%[42mSummary%_$E%[0m
echo %_$E%[34mInputfile="%%~a"%_$E%[0m
echo %_$E%[32mOutputfile="%%~dpna_!_TSDato!-!_TSTid!.mp4"%_$E%[0m
echo %_$E%[42mFile "%%~na" optimisation complete%_$E%[0m
);=
timeout -1 | =;( echo. & echo All files optimised! );= & endlocal
一些程序在执行期间内部改变 chcp,并且不会返回到此次执行/改变之前定义活动 chcp。
请注意,我并不是说这是导致(您的)问题的原因,而且我也没有忽视其他原因,但是如果在运行 ffmpeg 之后,您再次激活 chcp 65001,它也可能会起作用,因为在我的测试中问题已经在这里得到解决。
我在 Windows 10 上,也出现了同样的问题,通过这种方式解决了。如果它帮你解决了问题,请告诉我。