【问题标题】:How to change Screen buffer size in Windows Command Prompt from batch script如何从批处理脚本更改 Windows 命令提示符中的屏幕缓冲区大小
【发布时间】:2011-06-09 05:24:00
【问题描述】:

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

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

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

MODE CON: COLS=90 LINES=10

但是如何改变缓冲区大小呢?

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

【问题讨论】:

  • 您知道在编辑缓冲区时可以选择“将这些属性应用到未来的窗口”吗?
  • @StingyJack 他想在脚本中更改它,而不是手动更改。

标签: windows batch-file cmd


【解决方案1】:

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

mode con:cols=140 lines=70

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

通过设置“lines=2500”(或任何您想要的缓冲区)运行命令,然后检查窗口的“属性”,您会发现缓冲区现在确实设置为 2500,这很容易证明。

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

@echo 关闭 cmd "模式 con:cols=140 行=2500"

【讨论】:

  • AAArrrgh!太糟糕了!所以,你的意思是我只能选择一个使用最大屏幕高度但有一个很好的大缓冲区的窗口,或者一个看起来更好看但高度短但只有一个可见缓冲区的窗口。瘸。太糟糕了,您可以执行以下操作: cols=120 lines=50 buffer=9999 。那会摇滚。
  • 现在,我尝试使用批处理文件:mode con: cols=25 lines=5。但正如 Namuna 指出的那样,它只是将我的缓冲区大小和窗口大小都重新调整为我在命令中给出的大小。我想调整它们的大小,但大小不同。似乎没有办法在不改变屏幕缓冲区大小的情况下改变窗口大小,反之亦然。
【解决方案2】:

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

mode con lines=32766

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

【讨论】:

  • 赞成,您也可以像这样添加列:mode con:cols=140 lines=70。从接受的答案中得到它。
【解决方案3】:
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-batch.cmd 中使用它即可调用您的主脚本。

【讨论】:

    【解决方案4】:

    下面是一个非常简单的 VB.NET 程序,它可以满足您的需求。

    它将缓冲区设置为 100 字符宽 x 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 的值,程序将抛出异​​常。

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

    【讨论】:

    • 好吧,如果你真的想这样做,你将需要一些程序,因为没有本地方法,AFAIK,来完成这个。
    • 如何在批处理文件中实现这一点?
    • @djangofan 你需要先编译它。 Visual Basic 2005、2008 或 2010 Express(全部免费)应该能够编译它。我更改了代码以使其更加健壮...您可能需要进行一些进一步的更改。
    • 致反对者...您是否发现代码有问题或有其他问题?
    • 我在lifeboat.com/programs/console.exe 编译了一个版本,它只是将缓冲区高度设置为 32766。它不会调整任何其他内容。这是我在快捷方式中使用的目标,我希望在 f 目录中启动:C:\Windows\System32\cmd.exe /k "console & cd /d c:\f"
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      如果有人觉得它有用,我会这样做(根据此线程中的其余答案,我使用了很多东西)

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

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

      我将它保存为“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 行,请不要忘记脚本末尾的退出命令。

      【讨论】:

      • ...那是 Windows 98 吗?
      【解决方案7】:

      没有“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

      【讨论】:

      • 这不是一个真正的选择,因为它需要每个人都安装许多人使用的 tee 及其脚本......但感谢您提供信息
      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

          您可以通过单击左上角的图标-->属性-->布局-->屏幕缓冲区大小来更改cmd的缓冲区大小。
          您甚至可以使用 cmd 命令更改它

          mode con:cols=100 lines=60
          最多行= 58 cmd窗口的高度发生变化..
          在行值为 58 之后,cmd 的缓冲区大小会发生变化...

          【讨论】:

            【解决方案11】:

            我知道这个问题已有 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 的值必须大于或等于 windowssize 的值。

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

            【讨论】:

              【解决方案12】:

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

              mode 648 78 >nul 2>nul
              

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

              【讨论】:

              • 这是如何工作的?尝试以下操作,发现缓冲区与预期不符:mode 9000 78 &gt;nul 2&gt;nul; FOR /L %%G IN (1,1,1000) DO echo %%G; pause
              【解决方案13】:

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

              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"
              

              【讨论】:

                【解决方案14】:

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

                Windows Powershell ISE

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

                PS。我知道这个答案与最初的问题有点不同,但我相信值得一提,因为它是一个很好的解决方法。

                【讨论】:

                  猜你喜欢
                  • 2012-03-30
                  • 2012-08-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-01-05
                  • 2013-08-13
                  • 1970-01-01
                  • 2021-12-21
                  • 2014-09-08
                  相关资源
                  最近更新 更多