如何仅回显空格而不换行

时间:2016-12-02 21:00:11

标签: batch-file ffmpeg

我正在开发一个简单的批处理脚本,它循环遍历目录中的文件并使用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="    " 

我尝试了我认为的退格技巧,但它没有用。有没有办法做到这一点?

2 个答案:

答案 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