这是一个简单的混合批处理/JScript 脚本,我认为它可以满足您的需求。
show3.bat
@if (@X)==(@Y) @end /* harmless hybrid line that begins a JScrpt comment
::: Batch part ::::
@cscript //nologo //e:JScript "%~f0"
@exit /b
*** JScript part ***/
while( !WScript.StdIn.AtEndOfStream ) {
WScript.StdOut.Write( '\x08\x08\x08' + WScript.StdIn.ReadLine().substr(0,3) );
}
WScript.StdOut.WriteLine();
用法:
yourCommand | show3
该脚本可以简化为纯 JScript,但使用起来就不那么方便了:
show3.js
while( !WScript.StdIn.AtEndOfStream ) {
WScript.StdOut.Write( '\x08\x08\x08' + WScript.StdIn.ReadLine().substr(0,3) );
}
WScript.StdOut.WriteLine();
用法:
yourCommand | cscript //nologo show3.js
编辑正如 jeb 评论的那样,您不需要任何 redist 即可使用此解决方案。
我采用了 jeb 的回答中的一些概念,并将整个过程组合成一个混合脚本。不需要独立的“show3”文件。
@if (@X)==(@Y) @end /* harmless hybrid line that begins a JScrpt comment
:: ***** Batch part ******
@echo off
REM whatever batch code you need goes here
yourCommand | cscript //nologo //e:JScript "%~f0"
REM whatever batch code you need goes here
exit /b
****** JScript part ******/
while( !WScript.StdIn.AtEndOfStream ) {
WScript.StdOut.Write( '\x08\x08\x08' + WScript.StdIn.ReadLine().substr(0,3) );
}
WScript.StdOut.WriteLine();
yourCommand
将是您使用的任何压缩命令。yourCommand 2>&1
根据您的评论,如果您想要的输出打印到标准错误而不是标准输出,听起来您可能必须使用。
我创建了一个“yourCommand.bat”文件用于测试目的。它粗略地模拟了您为压缩程序描述的输出行为。
@echo off
for /l %%A in (1 1 100) do (
echo %%A "I don't want to see this quoted text"
for /l %%B in (1 1 50000) do rem
)
最后,如果你真的想要一个纯批处理的解决方案,我大大简化了jeb的解决方案。我删除了临时文件并使用了管道。
@echo off
if "%~1"==":show3" goto :show3
REM whatever batch code you need goes here
(yourCommand & echo EOF) | "%~f0" :show3
REM whatever batch code you need goes here
exit /b
:show3
setlocal enableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
:read
set "ln="
set /p "ln="
if not defined ln goto :read
for /f "tokens=1* delims= " %%A in ("!ln!") do if "%%A%%B" equ "EOF" (
echo(
exit /b
)
<nul set /p "=!ln:~0,3! !cr!"
goto :read
编辑-我修改了 EOF 测试以忽略任何前导或尾随空格。这应该使代码更加健壮。