10

我最近了解到,我可以控制运行我的程序的 CMD 窗口的大小mode x,y。但是我最近注意到这会设置缓冲区大小,并且窗口将调整以匹配或最大化屏幕大小。

我想使用mode 100,50窗口大小,但我也想保留一个更大的缓冲区——至少我想要的开发mode 100,9999

有没有办法做到这一点?

4

6 回答 6

27

我不认为有一个本地批处理命令可以独立控制缓冲区和窗口大小。.NET 可以控制两者,但我认为 VBScript 或 JScript 无法访问该功能。但是 powershell 可以:-) 请参阅如何扩展 Windows PowerShell 控制台的宽度?

值得庆幸的是,当 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
于 2012-11-12T20:52:06.560 回答
2

有一个“ConSetBuffer”二进制文件可以专门执行此操作,我发现它可以可靠地工作。它和相关的控制台实用程序可在此页面上的“conutils.zip”链接中找到。

于 2012-12-10T22:37:06.367 回答
1

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

于 2013-11-02T00:18:36.443 回答
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();
     }
  }
于 2012-11-13T15:48:52.477 回答
0

这个问题的答案不起作用,因为我收到关于发送到 PowerShell 命令的变量的错误,所以我修改了工作。

PowerShell 命令只是添加uiHeightBufferuiHeight变量以显示滚动条。


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

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

同样要启用 UTF-8 编码,您必须在 `:CMDSIZE' 调用的开头设置默认值并在结尾设置它,否则,字体大小会有点滑稽。

如果您不想影响这一点,则省略chcp 850 >NUL &and是您会做的。chcp 65001 >NUL &

这适用于Version: 1909Windows 10。

@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
于 2020-01-22T17:18:47.887 回答
-1

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

mode 648 78 >nul 2>nul

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

于 2014-05-15T10:04:49.147 回答