Batch file 如何只回显空白而不回显换行符
我正在编写一个简单的批处理脚本,该脚本在目录中的文件上循环,并使用ffmpeg处理它们。出于可读性目的,我想将ffmpeg输出缩进4个空格,但我想不出一种可行的方法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
@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