如何在批处理脚本中更改Windows命令提示符中的屏幕缓冲区大小

时间:2011-01-14 15:29:18

标签: windows batch-file cmd

我知道您可以右键单击属性 - >布局并手动更改它。

但您如何从Windows批处理脚本中更改它?

我知道你可以使用类似的东西从脚本中改变它的大小

MODE CON: COLS=90 LINES=10

但是如何更改缓冲区大小?

脚本会运行一段时间,有时会失败并退出它需要一些时间,所以我需要更大的缓冲区。

14 个答案:

答案 0 :(得分:57)

我只是在寻找这个确切问题的答案,来找出命令本身调整缓冲区!

mode con:cols=140 lines=70

lines = 70 部分实际调整了“屏幕缓冲区大小”设置中的高度,而不是“窗口大小”设置中的高度。

通过运行命令设置'lines = 2500'(或任何你想要的缓冲区)然后检查窗口的'属性',你会看到确实缓冲区现在设置为2500。

我的批处理脚本最终看起来像这样:

@echo off
cmd "mode con:cols=140 lines=2500"

答案 1 :(得分:43)

我只是试试Windows 7上的最大行我可以使用mode con命令设置并发现它是32766 2 ^ 15-2你可以用以下命令设置它

mode con lines=32766

虽然您也可以从GUI设置屏幕缓冲区大小,但您可以获得的最大值是9999。

答案 2 :(得分:12)

mode con lines=32766

设置缓冲区,但也将窗口高度增加到全屏,这很难看。

您可以直接在注册表中更改设置:

:: escape the environment variable in the key name
set mySysRoot=%%SystemRoot%%

:: 655294544 equals 9999 lines in the GUI
reg.exe add "HKCU\Console\%mySysRoot%_system32_cmd.exe" /v ScreenBufferSize /t REG_DWORD /d 655294544 /f

:: We also need to change the Window Height, 3276880 = 50 lines
reg.exe add "HKCU\Console\%mySysRoot%_system32_cmd.exe" /v WindowSize /t REG_DWORD /d 3276880 /f

您启动的下一个cmd.exe具有增加缓冲区。

因此,这对您已经使用的cmd.exe不起作用,但只需在pre.class.cmd中使用它,而不是调用主脚本。

答案 3 :(得分:7)

下面是一个非常简单的VB.NET程序,可以做你想要的。

它将缓冲区设置为100个字符宽,1000个字符高。然后它设置窗口的宽度以匹配缓冲区大小。

Module ConsoleBuffer
  Sub Main()
    Console.WindowWidth = 100
    Console.BufferWidth = 100
    Console.BufferHeight = 1000
  End Sub
End Module

更新

我将代码修改为首先设置Console.WindowWidth,然后设置Console.BufferWidth,因为如果您尝试将Console.BufferWidth设置为小于当前Console.WindowWidth的值,程序将抛出例外。

这只是一个示例......您应该添加代码来处理命令行参数和错误处理。

答案 4 :(得分:5)

CMD: Set buffer height independently of window height有一个解决方案,有效地使用从批处理脚本执行的powershell命令。这个解决方案让我可以独立于窗口大小调整现有批处理脚本窗口中的回滚缓冲区,这正是OP所要求的。

警告:它似乎让脚本忘记了变量(或者至少是我的脚本),所以我建议只在脚本的开头和/或结尾调用命令,否则你不依赖它在会话局部变量上。

答案 5 :(得分:3)

以下是我做过的事情,以防有人发现它有用(我根据这个帖子中的其余答案使用了很多东西)

首先,我根据需要调整了布局设置。这会立即更改窗口大小,因此更容易设置我想要的确切大小。 顺便说一下,我不知道我的宽度也可以小于宽度缓冲区。这很好,因为我通常讨厌被包裹的长行。 enter image description here

然后点击确定后,我打开了regedit.exe并转到“HKEY_CURRENT_USER \ Console”。那里有一个新的子条目“%SystemRoot%_system32_cmd.exe”。我右键点击它并选择导出: enter image description here

我将其保存为“cmd_settings.reg”。然后我创建了一个导入这些设置的批处理脚本,调用我原来的批处理脚本(名称batch_script.bat),然后删除我导入的内容,命令行窗口返回默认设置:

regedit /s cmd_settings.reg
start /wait batch_script.bat
reg delete "HKEY_CURRENT_USER\Console\%%SystemRoot%%_system32_cmd.exe" /f

这是一个可以调用的样本批处理(“batch_script.bat”):

@echo off
echo test!
pause
exit

如果您希望在脚本执行后运行reg delete行,请不要忘记脚本末尾的exit命令。

答案 6 :(得分:2)

没有“DOS命令提示符”。 DOS完全死于Windows ME(7/11/2006)。它简称为Windows NT上的命令提示符(NT,2K,XP,Vista,7)。

无法通过内置cmd.exe命令更改屏幕缓冲区。它可以通过Console API Functions进行更改,因此您可以创建一个实用程序来修改它。我自己从未尝试过这个。

另一个建议是将输出重定向到文件和屏幕,以便您拥有它的“硬拷贝”。 Windows没有像Unix那样的TEE命令,而是someone has remedied that

答案 7 :(得分:1)

我创建了以下实用程序来设置控制台大小和滚动缓冲区。

我使用DEV C ++(http://www.bloodshed.net/devcpp.html)编译它。

https://sourceforge.net/projects/wa2l-wintools/中包含可执行文件。

#include <iostream>
#include <windows.h> 

using namespace std;


// SetWindow(Width,Height,WidthBuffer,HeightBuffer) -- set console size and buffer dimensions
//
void SetWindow(int Width, int Height, int WidthBuffer, int HeightBuffer) { 
    _COORD coord; 
    coord.X = WidthBuffer; 
    coord.Y = HeightBuffer; 

    _SMALL_RECT Rect; 
    Rect.Top = 0; 
    Rect.Left = 0; 
    Rect.Bottom = Height - 1; 
    Rect.Right = Width - 1; 

    HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);      // Get Handle 
    SetConsoleScreenBufferSize(Handle, coord);            // Set Buffer Size 
    SetConsoleWindowInfo(Handle, TRUE, &Rect);            // Set Window Size 
}  // SetWindow



// main(Width,Height,WidthBuffer,HeightBuffer) -- main
//
int main(int argc, char *argv[]) {     
    int width = 80;
    int height = 25;
    int wbuffer = width + 200;
    int hbuffer = height + 1000;

    if ( argc == 5 ){
        width = atoi(argv[1]);
        height = atoi(argv[2]);
        wbuffer = atoi(argv[3]);
        hbuffer = atoi(argv[4]);
    } else if ( argc > 1 ) {
        cout << "Usage: " << argv[0] << " [ width height bufferwidth bufferheight ]" << endl << endl;
        cout << "  Where" << endl;
        cout << "    width            console width" << endl;
        cout << "    height           console height" << endl;
        cout << "    bufferwidth      scroll buffer width" << endl;
        cout << "    bufferheight     scroll buffer height" << endl;
        return 4;
    }    

    SetWindow(width,height,wbuffer,hbuffer);
    return 0;
} 

答案 8 :(得分:1)

如果有人还在想,在较新版本的Windows上你可以使用powershell:

powershell.exe -command "& {$pshost = Get-Host;$pswindow = $pshost.UI.RawUI;$newsize = $pswindow.BufferSize;$newsize.height = 150;$pswindow.buffersize = $newsize;}"

答案 9 :(得分:1)

您可以点击左上角的图标更改cmd的缓冲区大小 - &gt; properties - &gt;布局 - &gt;屏幕缓冲区大小。
你甚至可以用cmd命令改变它
mode con:cols=100 lines=60
最多行= 58 cmd窗口的高度变化..
在行值为58之后,cmd的缓冲区大小发生变化......

答案 10 :(得分:0)

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

mode 648 78 >nul 2>nul

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

答案 11 :(得分:0)

我正在扩展我在此处发布的评论,因为大多数人不会注意到该评论。

https://lifeboat.com/programs/console.exehttps://stackoverflow.com/a/4694566/1752929中描述的Visual Basic程序的编译版本。我的版本只是将缓冲区高度设置为32766,这是可用的最大缓冲区高度。它不会调整其他任何内容。如果有很多需求,我可以创建一个更灵活的程序,但是通常您可以在快捷方式布局标签中设置其他变量。

以下是我希望从f目录开始的快捷方式中使用的目标。 (我必须以这种方式设置目录,因为如果您希望以管理员身份运行命令提示符,Windows将不允许您以其他任何方式进行设置。)

C:\Windows\System32\cmd.exe /k "console & cd /d c:\f"

答案 12 :(得分:0)

作为解决方法,您可以使用...

Windows Powershell ISE

由于Powershell脚本编辑器的read-eval-print-loop部分(“ blue”部分)似乎没有缓冲区限制。使用Powershell,您也可以执行DOS命令。

PS。我知道此答案与原始问题有所不同,但是我认为值得一提,因为这是一个很好的解决方法。

答案 13 :(得分:0)

我知道这个问题已经9岁了,但也许对于某个人来说,它会更加有趣。根据问题,仅更改缓冲区大小,可以使用Powershell。 使用Powershell的最短命令是:

powershell -command "&{(get-host).ui.rawui.buffersize=@{width=155;height=999};}"

将宽度和高度的值替换为所需的值。

但是,可能是您提出问题的原因是在不减小缓冲区大小的情况下修改命令行窗口的大小。为此,您可以使用以下命令:

start /b powershell -command "&{$w=(get-host).ui.rawui;$w.buffersize=@{width=177;height=999};$w.windowsize=@{width=155;height=55};}"

您可以在那里独立修改缓冲区和窗口的大小。为避免出现错误消息,请考虑buffersize的值必须大于或等于windowsize的值。

另外实现的是start /b命令。 Powershell命令有时需要花费几秒钟来执行。使用此附加命令,Powershell可以并行运行,并且不会显着延迟以下命令的处理。