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

57

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

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

我知道你可以使用类似于以下内容的脚本更改其大小:

MODE CON: COLS=90 LINES=10

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

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


你知道在编辑缓冲区时可以选择“应用这些属性到将来的窗口”吗? - StingyJack
1
@StingyJack 他想在脚本中进行更改,而不是手动操作。 - FluorescentGreen5
14个回答

62

我刚刚在搜索这个确切问题的答案,结果发现这个命令本身会调整缓冲区!

mode con:cols=140 lines=70

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

可以通过使用“lines = 2500”(或您想要的任何缓冲区)的设置运行命令,然后检查窗口的“属性”,您将看到确实已将缓冲区设置为2500。

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

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

8
啊啊啊!太糟糕了!所以,你的意思是我只能选择一个使用最大屏幕高度但有一个漂亮大的缓冲区的窗口或者一个外观更好但高度较短且只有可见缓冲区的窗口。太糟糕了。要是能像这样做就好了:cols=120 lines=50 buffer=9999。那就太棒了。 - djangofan
1
现在,我尝试使用批处理文件执行以下命令:mode con: cols=25 lines=5。但正如Namuna所指出的那样,它只会将我的缓冲区大小和窗口大小都调整为我在命令中给定的大小。我想要分别调整它们的大小,但似乎没有办法在不改变屏幕缓冲区大小的情况下更改窗口大小,反之亦然。 - Neeraj Tiwari

50

我在尝试使用mode con命令设置Windows 7上的最大行数,并发现可以将其设置为32766,即2^15-2,并且您可以使用以下命令进行设置

mode con lines=32766

虽然你也可以从GUI中设置屏幕缓冲区大小,但最大值只能达到9999。


点赞了,你也可以像这样添加列: mode con:cols = 140 lines = 70。从已接受的答案中得到的。 - FluorescentGreen5

18
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,但只需在预处理batch.cmd中使用此命令,然后调用您的主脚本即可。

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的值,程序将抛出异常。

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


1
你如何在批处理文件中实现这个? - djangofan
1
@djangofan 你需要先编译它。Visual Basic 2005、2008或2010 Express(全部免费)应该可以编译它。我修改了代码,使其更加健壮...你可能还想进行一些进一步的更改。 - aphoria
给那位点踩的人...你是发现了代码问题还是有其他问题? - aphoria
有没有办法在命令行上以vbs的形式运行它,也可以用wscript/cscript吗? - gotwo
@gotwo 不,这段代码依赖于.NET,因此它无法作为VBScript运行。 - aphoria
显示剩余2条评论

5
有一个解决方案位于CMD:设置缓冲区高度与窗口高度无关,有效地采用从批处理脚本执行的PowerShell命令。该解决方案使我能够独立调整现有批处理脚本窗口中的滚动缓冲区大小,正是OP所要求的。

注意:它似乎会使脚本忘记变量(或者至少在我的脚本中是这样),因此建议仅在脚本的开头和/或结尾处调用该命令,或者在您不依赖于会话局部变量的其他位置调用。


4
这是我做的事情,希望有用(根据本主题中其他答案的建议,我使用了许多工具)
首先,我根据需要调整了布局设置。这样可以立即更改窗口大小,因此我可以更轻松地设置所需尺寸。顺便说一下,我不知道可视宽度也可以比缓冲区宽度小。这很好,因为我通常不喜欢过长的行被折叠。 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

不要忘记在脚本结尾添加exit命令,这样才能确保在脚本执行后运行reg delete命令。

1
那是Windows 98吗? - Hashim Aziz

3

“DOS命令提示符”已经不存在了。DOS在Windows ME(7/11/2006)中完全消失。在Windows NT(即NT、2K、XP、Vista、7)中,它被简称为命令提示符。

没有内置的cmd.exe命令可以改变屏幕缓冲区。可以通过Console API Functions来改变它,所以您可能能够创建一个实用程序来修改它。我自己从未尝试过这种方法。

另一个建议是将输出重定向到文件和屏幕,以便您有一个“硬拷贝”。Windows没有像Unix那样的TEE命令,但有人已经解决了这个问题


这不是一个真正的选择,因为它需要每个人安装tee和其脚本,而且这个脚本被许多人使用。但还是谢谢您提供的信息。 - grobartn

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;
} 

1

我知道这个问题已经有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};}"

在那里,您可以独立修改缓冲区和窗口的大小。为避免出现错误消息,请注意缓冲区大小的值必须大于或等于窗口大小的值。
另外实现了start /b命令。PowerShell命令有时需要几秒钟才能执行。通过此额外命令,PowerShell可以并行运行,并不会显著延迟后续命令的处理。

1
如果有人还在疑惑,在更新版本的Windows上,您可以使用PowerShell:
powershell.exe -command "& {$pshost = Get-Host;$pswindow = $pshost.UI.RawUI;$newsize = $pswindow.BufferSize;$newsize.height = 150;$pswindow.buffersize = $newsize;}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接