我正在开发一个简单的批处理脚本,它循环遍历目录中的文件并使用ffmpeg处理它们。出于可读性的目的,我想缩进ffmpeg输出4个空格,但我无法想出一种有效的方法。
@echo off
for %%a in (%~dp0rawVideo\*.MP4) do (
if exist %~dp0rawAudio\%%~na.wav (
echo Already Processed :
echo %%a
) else (
echo Processing :
echo %%a
echo|set /p leadingSpace="# "
ffmpeg -c:v h264 -threads 24 -i %%a -map_channel 0.1.0 -map_channel -1 -y -v quiet -stats %~dp0rawAudio\%%~na.wav
)
echo(
)
pause
如果我这样做,我什么也得不到,因为我读过窗户带领的白色空间。
echo|set /p leadingSpace=" "
我尝试了我认为的退格技巧,但它没有用。有没有办法做到这一点?
答案 0 :(得分:0)
这是一种运行命令并为前缀输出的每一行加前缀的方法。
没有参数的简单示例:
@echo off
for /F "delims=" %%a in ('ffmpeg.exe 2^>^&1') do echo # %%a
的问题:
# ffmpeg version N-80980-g7af44ce Copyright (c) 2000-2016 the FFmpeg developers
# built with gcc 5.4.0 (GCC)
# configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-li
bmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-libebur128 --enable-fontconfig --enabl
e-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable
-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug -
-enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enab
le-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-li
bspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-l
ibvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --en
able-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
# libavutil 55. 28.100 / 55. 28.100
# libavcodec 57. 50.100 / 57. 50.100
# libavformat 57. 41.100 / 57. 41.100
# libavdevice 57. 0.102 / 57. 0.102
# libavfilter 6. 47.100 / 6. 47.100
# libswscale 4. 1.100 / 4. 1.100
# libswresample 2. 1.100 / 2. 1.100
# libpostproc 54. 0.100 / 54. 0.100
# Hyper fast Audio and Video encoder
# usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
# Use -h to get full help or, even better, run 'man ffmpeg'
它将标准错误重定向到标准输出(因此错误消息也是前缀)并使用空分隔符,因此%%a
是整行。
由于每次发出一行时都会调用它,因此很容易以你想要的方式回显它。
当然,如果命令只发出一行,它也可以工作。
由于您只有一行,另一种方法是使用临时文件来获取ffmpeg
的输出,然后以此文件的形式重定向作为输入,以交互方式分配变量。然后根据需要回复它:
ffmpeg -c:v h264 -threads 24 -i %%a -map_channel 0.1.0 -map_channel -1 -y -v quiet -stats %~dp0rawAudio\%%~na.wav> %TEMP%\tmpf
set /P ffmpegout=<%TEMP%\tmpf
echo %ffmpegout%
答案 1 :(得分:0)
您可以将输出通过管道传输到任何提供搜索/替换功能的实用程序。没有可用的本机Windows批处理命令,但您可以使用JREPL.BAT - a regular expression text processing utility之类的内容。 JREPL.BAT是纯脚本(混合批处理/ JScript),可以在任何Winidows机器上从XP本身运行 - 不需要第三方exe文件。可以从命令行通过jrepl /?
或jrepl /??
获取完整文档以获取分页帮助。
@echo off
for %%a in (%~dp0rawVideo\*.MP4) do (
if exist %~dp0rawAudio\%%~na.wav (
echo Already Processed :
echo %%a
) else (
echo Processing :
echo %%a
ffmpeg -c:v h264 -threads 24 -i %%a -map_channel 0.1.0 -map_channel -1 -y -v quiet -stats %~dp0rawAudio\%%~na.wav | jrepl "^" " "
)
echo(
)
pause
每次调用JREPL都会有很长的延迟,因为必须实例化CSCRIPT引擎,并且必须编译JScript。一旦启动,该实用程序非常快。但在这种情况下,每次迭代的小数秒延迟可能会令人恼火。
如果通过单个JREPL实例管道整个FOR循环输出,性能可以大大提高。唯一的技巧是将搜索结构化为仅匹配需要加前缀的行。
这里我假设ffmpeg总是在每行输出的第一个位置放置一个非空格字符,而ffmpeg输出永远不会包含&#34;处理&#34;
@echo off
(
for %%a in (%~dp0rawVideo\*.MP4) do @(
if exist %~dp0rawAudio\%%~na.wav (
echo Already Processed :
echo %%a
) else (
echo Processing :
echo %%a
ffmpeg -c:v h264 -threads 24 -i %%a -map_channel 0.1.0 -map_channel -1 -y -v quiet -stats %~dp0rawAudio\%%~na.wav
)
echo(
)
) | jrepl "^(?=[^ ])(?!.*Process)" " "
pause