批处理脚本,重新格式化cli应用程序的输出

PTS*_*PTS 3 formatting batch-file

我有一个非常小的批处理脚本,它提取了大量的文件.该脚本旨在与压缩数据一起提供给其他用户.

现在我的问题是这个压缩工具正在向cmd窗口输出大量数据.我认为这会混淆很多使用者因为输出真的"正在运行".它基本上显示每行的百分比以及它以何种速度(CPU和HDD)解压缩.许多令人困惑的数据,没有人需要看到.现在我真的不喜欢压缩程序的所有输出,在我看来,给用户反馈解压已经到达的程度是多么重要.那么是否可以重定向输出并只读取该输出的前三位数并将其传递给用户一行?因此,用户只能看到一个前进的优势(在一行中)而不是每秒都有20个新行与所有这些数据?

下面是一个关于它如何看待的例子:http: //i.imgur.com/5w5LH.png 压缩工具是SREP,我的操作系统Win 7 x64.

jeb*_*jeb 5

如果你使用windows批处理,它可以完成,但它并不简单,因为你通常会使用FOR/F-Loop.

就像for /f "delims=" %%a in (7z packit ... ) do ...
问题在于,for-loop将首先收集所有数据并等待7z它在处理任何输出行之前的结束.

唯一的方法是重定向输出,并同时扫描它.
但要做到这一点,你需要第二个线程(最好在同一个cmd窗口中).

像这样的东西可以完成这项工作

@echo off
echo start
setlocal EnableDelayedExpansion
if "%1"=="internal" goto :readThread
start /b cmd /c ""%~f0" internal"

rem *** myPacker pack here and redirect the output
del archive.7z
del output.tmp
start "title" /b /wait cmd /c  "%ProgramFiles%\7-Zip\7z" u  archive \tempx\*.rtf \tempx\*.pdf ^> output.tmp
echo EOF>>output.tmp
echo ENDE
:waitForEnd
(
> lock (
  rem
) || goto :waitForEnd
) 2> nul
exit /b

:readThread

for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
echo ####!cr!x
echo(
<output.tmp ( 
    echo ## before
    call :readData 2> lock
    echo after
)
exit /b

:readData
set "var="
set /p var=
if "!var!"=="EOF" exit /b
if defined var (
  <nul set /p ".=Processing files, currently at !var:~0,4!!CR!"
)
goto :readData
Run Code Online (Sandbox Code Playgroud)