Batch file 如何只回显空白而不回显换行符

Batch file 如何只回显空白而不回显换行符,batch-file,ffmpeg,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 ( ech

我正在编写一个简单的批处理脚本,该脚本在目录中的文件上循环,并使用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="    " 
我也尝试了我认为是退格的技巧,但没有成功。没有办法做到这一点吗?

第一种解决方案

下面是一种运行命令并为前缀输出的每一行添加前缀的方法

没有参数的简单示例:

@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%
ffmpeg-c:v h264-threads 24-i%%a-map\u channel 0.1.0-map\u channel-1-y-v quiet-stats%~dp0rawAudio\%%~na.wav>%TEMP%\tmpf

set/P ffmpegout=

您可以将输出通过管道传输到任何提供搜索/替换功能的实用程序中。没有可用的本机Windows批处理命令,但您可以使用类似的命令。JREPL.BAT是纯脚本(混合批处理/JScript),从XP开始在任何Winidows机器上本机运行-不需要第三方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输出从不包含“进程”


这是一种纯粹的批处理文件方法,用于创建具有任意数量空格且末尾没有换行符的文件,因此可以通过
type spaces.txt
set/p
命令之前显示该文件,以便显示前导空格:

@echo off
setlocal

call :createFourSpaces
type fourSpaces.txt
set /P "=After the spaces" < NUL
echo/
exit /B

:createFourSpaces
for %%X in (^"^
% Do NOT remove this line %
^") do set /P "=X%%~X    " > fourSpaces.tmp <NUL
findstr /V "X" fourSpaces.tmp > fourSpaces.txt
del fourSpaces.tmp
exit /B
@echo关闭
setlocal
调用:createFourSpaces
键入fourSpaces.txt
set/P“=在空格“fourSpaces.tmp fourSpaces.txt
del fourSpaces.tmp
退出/B

您想在每行
ffmpeg
之前添加前缀,对吗?不仅仅是一行吗?@Jean-Françoisfare我调用ffmpeg的方式它只生成一行输出,我只想在前面加4个空格。检查我的答案。一行或多行,大多数字符串操作使用批处理的
for
。解决此问题的最简单方法是通过文本编辑器(即记事本)预先创建一个包含四个空格且结尾没有新行的文本文件,然后只需执行
键入fourSpaces.txt
…我可以将其设置为精细前缀,但是如果我只想在空白处加前缀,它总是失败的。顺便说一句,你试过:
echo | set/p leadingSpace=“#”&&ffmpeg-c:v h264-threads 24-I%%a-map\u channel 0.1.0-map\u channel-1-y-v quiet-stats%%dp0rawAudio\%%~na.wav
(在一行上,使用
&
链接命令?)@Jean-Françoisfare-OP不需要
#
字符-它只用于模拟所需的缩进。我相信您的前两个解决方案在没有
#
的情况下可以正常工作。但是如果没有
#
@dbenham,第三种解决方案将无法工作。你是对的!哎呀,这批货充满了(糟糕的)惊喜。已编辑,谢谢。您忘了从剩下的两个解决方案中删除#
@echo off
setlocal

call :createFourSpaces
type fourSpaces.txt
set /P "=After the spaces" < NUL
echo/
exit /B

:createFourSpaces
for %%X in (^"^
% Do NOT remove this line %
^") do set /P "=X%%~X    " > fourSpaces.tmp <NUL
findstr /V "X" fourSpaces.tmp > fourSpaces.txt
del fourSpaces.tmp
exit /B