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

我知道你可以做右键单击属性 – >布局,并在那里手动更改。

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

我知道你可以用脚本来改变它的大小

MODE CON: COLS=90 LINES=10

但是你怎么能改变缓冲区大小呢?

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

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

 mode con:cols=140 lines=70 

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

通过运行带有'lines = 2500'(或任何需要的缓冲区)设置的命令,然后检查窗口的“属性”,可以看到事实上缓冲区现在设置为2500。

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

 @echoclosures
 cmd“mode con:cols = 140 lines = 2500”

我只是试图在Windows 7的最大线我可以使用mode con命令设置,发现它是32766 2 ^ 15-2,你可以用下面的命令设置它

 mode con lines=32766 

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

 mode con lines=32766 

设置缓冲区,但也增加了窗口高度到全屏,这是丑陋的。

您可以直接在registry中更改设置:

 :: 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,但是只需要在调用你的主脚本之前的batch.cmd中使用它。

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

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

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

UPDATE

我修改了代码,首先设置Console.WindowWidth ,然后设置Console.BufferWidth因为如果您尝试将Console.BufferWidth设置为小于当前的Console.WindowWidth值,则该程序将引发exception。

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

CMD有一个解决scheme:有效地使用从批处理脚本执行的powershell命令, 独立于窗口高度设置缓冲区高度 。 这个解决scheme可以让我在现有的批处理脚本窗口中调整回滚缓冲区,而与窗口大小无关,正是OP所要求的。

警告:这似乎使脚本忘记variables(或者至less它是用脚本做的),所以我build议只在脚本的开始和/或结束时调用该命令,否则在不依赖于会话的地方局部variables。

以下是我所做的,以防有人发现它有用(根据本主题中的其余答案,我使用了很多东西)

首先,我根据需要调整了布局设置。 这立即改变了窗口大小,所以更容易设置我想要的确切大小。 顺便说一下,我不知道我也可以看到宽度小于宽度缓冲区。 这很好,因为我通常恨一个长长的行被包裹。 在这里输入图像说明

然后点击确定后,我打开了regedit.exe并进入“HKEY_CURRENT_USER \ Console”。 有一个新的子项“%SystemRoot%_system32_cmd.exe”。 我右键单击并select导出: 在这里输入图像说明

我把它保存为“cmd_settings.reg”。 然后,我创build了一个批处理脚本,导入这些设置,调用我的原始批处理脚本(名称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命令。

没有“DOS命令提示符”。 DOS完全死于Windows ME( 7/11/2006 )。 这只是在Windows NT(即NT,2K,XP,Vista,7)上的命令提示符。

没有办法通过内置的cmd.exe命令来改变屏幕缓冲区。 它可以通过控制台API函数进行更改,所以您可能可以创build一个实用程序来修改它。 我从来没有尝试过这个。

另一个build议是将输出redirect到一个文件和屏幕上,这样你就有了一个“硬拷贝”。 Windows没有像Unix这样的TEE命令,但有人已经修复了这个问题 。

我find了一种调整缓冲区大小而不影响窗口大小的方法。 它的工作原理要归功于批量工作的一个缺陷,但是它完成了工作。

 mode 648 78 >nul 2>nul 

它是如何工作的? 在这个命令中有一个语法错误,它应该是“模式648,78”。 由于批量的工作方式,缓冲区大小将首先调整为648,然后窗口resize将会到来,但由于语法错误,它将永远不会完成。 瞧,缓冲区大小被调整,窗口大小保持不变。 这会产生一个丑陋的错误,所以为了摆脱它,只需添加“> nul 2> nul”,就完成了。

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

我使用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; } 

您可以通过点击左上angular的图标 – >属性 – >布局 – >屏幕缓冲区大小来更改cmd的缓冲区大小。
你甚至可以用cmd命令来改变它

mode con:cols=100 lines=60
Upto lines = 58 cmd窗口的高度改变。
在58行后,cmd的缓冲区大小发生变化。

如果有人仍然想知道,在新版本的Windows上,你可以使用powershell:

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