为Windows批量输出设置已定义的stdout输出区域?

时间:2017-06-18 02:40:21

标签: windows batch-file stdout

我有一个Windows批处理做了一些事情。 (很长一段时间,VM任务,QEMU和Lua)。

我想将所有stdout从批处理的echo和call命令(stdout)传递到Windows Consule显示窗口的已定义部分,以便在输出显示时在窗口的顶部和底部绘制带阴影的灰色标题栏脚本正在做什么。

类似于文本区域的类型,自动换行并将在CMD窗口中滚动,在窗口的已定义部分(复古示例,DOOM wad加载器,在顶部和底部放置红色标题栏)初始化,但在这里我喜欢用较烦人的颜色选择。)

我想知道这是否可以合理地完成,批处理文件或可执行包装程序可以将批处理文件传送到哪里,它将发送其stdout?

编辑:更新1

建议:PowerShell?

嵌入PowerShell以完成控制台窗口的设置非常精细和花花公子,但请记住,大多数公平的人将PowerShell执行权限设置为Restricted。添加自动提升VBScript和PowerShell权限调整器/ auto-unblocker / Restricted权限恢复的含义会增加不必要的批量,并且会给我的脚本添加恼人的UAC提示。

这个建议还冒着将智能AV绊倒在这种脚本的多语言扩展功能上的误报的风险。

建议:ANSI转义字符

高效批次非常好用,我想说。我知道倒灰色,会显示标题栏。现在答案已指向正确的方向。是否有ANSI Escape序列来调整输出缓冲区?如果您调整Consule Window的代码页,则此建议未明确锁定到Windows 10。

1 个答案:

答案 0 :(得分:1)

带有ansi逃逸序列的小样本 它将屏幕分成两个独立的区域, 前10行固定而不滚动,下面的区域使用滚动。

@echo off
call :cls
call :setWindowSize 50 120
call :setWindowPos 1040 0
call :splitWindow 11
call :gotoxy 1 1
for /L %%n in (1 1 5) do (
    echo Job: %%n
)
call :gotoxy 1 20
for /L %%n in (1 1 50) do (
    echo Cnt: %%n
)
exit /b

:setWindowSize
set "lines=%1
set "columns=%2"
call :echo-e "\e[8;%lines%;%columns%t";

:gotoxy
set "y=%1"
set "x=%2"
call :echo-e "\e[%x%;%y%H"
exit /b

:cls
call :echo-e "\e[2J"
exit /b

:setWindowPos
set "x=%1"
set "y=%2"
call :echo-e "\e[3;%x%;%y%t";
exit /b

:splitWindow
set /a "pos=%1 - 1"
call :echo-e "\ec\e[2J\e[%1;80r\e[%pos%H\e[46m\e[K\e[0m"
exit /b

:windowToFront
call :echo-e "\e[2t""\e[1t"
exit /b

:echo-e
set "arg1=%~1"
setlocal EnableDelayedExpansion
set "arg1=!arg1:\x=0x!"
set "arg1=!arg1:\e=0x1B!"
forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c <nul set /p 0x22=!arg1!0x22"
exit /b