在批处理 for 循环中使用 ffmpeg 会禁用 ANSI Escape 颜色

在批处理 for 循环中使用 ffmpeg 会禁用 ANSI Escape 颜色

我正在尝试使用 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 上,也出现了同样的问题,通过这种方式解决了。如果它帮你解决了问题,请告诉我。

相关内容