CMD:设置缓冲区高度,与窗口高度无关

时间:2012-11-09 16:23:38

标签: cmd

我最近了解到我可以使用mode x,y控制运行程序的CMD窗口的大小。然而,我刚才注意到这设置了缓冲区大小,窗口将调整为匹配或最大屏幕大小。

我想使用mode 100,50作为窗口大小,但我也希望保留一个arger缓冲区 - 至少我希望开发mode 100,9999

有没有办法做到这一点?

6 个答案:

答案 0 :(得分:26)

我认为没有一个本机批处理命令可以独立控制缓冲区和窗口大小。 .NET可以控制两者,但我不认为VBScript或JScript可以访问该功能。但是powershell可以:-)见How Can I Expand the Width of the Windows PowerShell Console?

值得庆幸的是,当PowerShell退出时,新设置将保留在CMD窗口中。

窗口大小始终小于或等于缓冲区大小非常重要。为简化起见,我首先使用MODE将窗口和缓冲区设置为所需的窗口大小,然后使用powershell设置缓冲区大小。

这是一个简单的 conSize.bat 混合批处理/ powershell脚本,它将大小作为参数:

@echo off
:conSize  winWidth  winHeight  bufWidth  bufHeight
mode con: cols=%1 lines=%2
powershell -command "&{$H=get-host;$W=$H.ui.rawui;$B=$W.buffersize;$B.width=%3;$B.height=%4;$W.buffersize=$B;}"

要获得所需的尺寸,您只需使用

即可
call conSize 100 50 100 9999

答案 1 :(得分:0)

这里有另一种变体:

/*
@echo off & mode 100,50
set "cscfile="
set Pathfile="%WinDir%\Microsoft.NET\Framework\csc.exe"
for /f "delims=" %%a in ('dir /b /a-d /s %PathFile%') do set "cscfile=%%a"
if defined cscfile (
  %cscfile% /nologo /out:"%~0.exe" %0
) else exit /b
"%~0.exe"
del "%~0.exe" 
cmd /k
*/

using System;

class Program
  {
     static void Main()
     { 
        Console.SetBufferSize(100, 9999); 
        Console.ForegroundColor = ConsoleColor.Green;
        Console.WriteLine("Current Logged UserName: " + Environment.UserName);
        Console.ResetColor();
        Console.WriteLine("[Enter] to continue");
        Console.ReadLine();
     }
  }

答案 2 :(得分:0)

有一个'ConSetBuffer'二进制可用,具体做到这一点,我发现它可靠地工作。它可以通过'conutils.zip'链接on this page获得它和相关的控制台实用程序。

答案 3 :(得分:0)

我为Windows写了一个小application,允许“最大化”窗口和缓冲区。可以很容易地扩展它以允许使用自定义值传递参数。

答案 4 :(得分:0)

这个问题的答案没有用,因为我收到了有关发送到PowerShell命令的变量的错误消息,所以我进行了修改。

PowerShell命令只需将uiHeightBuffer添加到uiHeight变量中即可显示滚动条。


编辑:添加了高度缓冲区作为第三个参数,并将TRUE或FALSE作为第四个参数来启用或禁用滚动条。

在这种情况下不需要滚动条时,退出带有小消息的脚本时,我发现这很有用。

要启用UTF-8编码,您还必须在`:CMDSIZE'调用的开始处设置默认值,并在结尾处进行设置,否则字体大小会变得有些滑稽。

如果不想影响此操作,则忽略chcp 850 >NUL &chcp 65001 >NUL &

这适用于Windows 10的Version: 1909

@echo off
title %~nx0
rem Based on this thread here: https://stackoverflow.com/a/13351373
goto MYROUTINE
:CMDSIZE
chcp 850 >NUL & set "uiWidth=%1" & set "uiHeight=%2"
mode %uiWidth%,%uiHeight%
if %4==TRUE (set /a "uiHeightBuffer=uiHeight+%3")
if %4==TRUE (powershell.exe -ExecutionPolicy Bypass -Command "&{$H=get-host;$W=$H.ui.rawui;$B=$W.buffersize;$B.width=%uiWidth%;$B.height=%uiHeightBuffer%;$W.buffersize=$B}")
if %4==FALSE (powershell.exe -ExecutionPolicy Bypass -Command "&{$H=get-host;$W=$H.ui.rawui;$B=$W.buffersize;$B.width=%uiWidth%;$B.height=%uiHeight%;$W.buffersize=$B}")
chcp 65001 >NUL & goto :EOF
:MYROUTINE
call :CMDSIZE 255 44 222 TRUE
title Do your routine here...
echo Do your routine here...
echo/ & pause
goto :EXITROUTINE
:EXITROUTINE
call :CMDSIZE 40 2 0 FALSE
title Exiting routine message...
echo Exiting routine message...
set /p "=" <NUL
ping localhost -n 3 >NUL & exit

答案 5 :(得分:-1)

我找到了一种在不影响窗口大小的情况下调整缓冲区大小的方法。它的工作原理归功于批处理的工作方式,但它完成了工作。

mode 648 78 >nul 2>nul

它是如何工作的?此命令中存在语法错误,它应为“mode 648,78”。由于批处理的工作方式,缓冲区大小将首先调整为648,然后窗口调整大小将会到来,但由于语法错误,它将永远不会完成。 Voila,调整缓冲区大小,窗口大小保持不变。这会产生一个丑陋的错误,所以要摆脱它只需添加“&gt; nul 2&gt; nul”就可以了。