为 Windows 批处理输出设置定义的标准输出输出区域?



我有一个Windows批处理可以做一些事情。 (相当长的VM任务,带有QEMU和Lua)。

我想通过管道将所有来自批处理的回显和调用命令 (stdout) 的 stdout 传输到 Windows Consule 显示窗口的已定义部分,以便在窗口顶部和底部绘制灰色阴影标题栏,同时输出显示脚本正在执行的操作。

有点像文本区域,它会像 CMD 窗口一样自动换行并滚动,在窗口的定义部分中(复古示例,DOOM wad 加载器,在初始化期间将红色标题栏放在顶部和底部,但在这里我希望它与不太烦人的颜色选择)。

我想知道这是否可以合理地在批处理或可执行包装器中完成,批处理文件可以通过管道传输到该包装器,它将将其标准输出发送到哪里?


编辑:更新 1

建议:PowerShell?

嵌入 PowerShell 以完成控制台窗口的设置固然很好,但请记住,大多数公平的人将 PowerShell 执行权限设置为"受限"。 这意味着添加自动提升 VBScript 和 PowerShell 权限调整器/自动解锁程序/受限权限还原会增加不必要的体积,以及我的脚本中烦人的 UAC 提示。

此建议还存在使智能 AV 因此类脚本的多语言扩展功能而陷入误报的风险。

建议:ANSI 转义字符

我会说,对于高效的批处理来说非常棘手。 我知道倒置的灰色,它会很好地显示标题栏。 现在,答案已经指向了正确的方向。 是否有 ANSI 转义序列来调整输出缓冲区? 如果您调整 Consule 窗口的代码页,则此建议不会显式锁定到 Windows 10。

带有 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 "ece[2Je[%1;80re[%pos%He[46me[Ke[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

最新更新