我最近了解到,我可以控制运行我的程序的 CMD 窗口的大小mode x,y
。但是我最近注意到这会设置缓冲区大小,并且窗口将调整以匹配或最大化屏幕大小。
我想使用mode 100,50
窗口大小,但我也想保留一个更大的缓冲区——至少我想要的开发mode 100,9999
。
有没有办法做到这一点?
我最近了解到,我可以控制运行我的程序的 CMD 窗口的大小mode x,y
。但是我最近注意到这会设置缓冲区大小,并且窗口将调整以匹配或最大化屏幕大小。
我想使用mode 100,50
窗口大小,但我也想保留一个更大的缓冲区——至少我想要的开发mode 100,9999
。
有没有办法做到这一点?
我不认为有一个本地批处理命令可以独立控制缓冲区和窗口大小。.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
有一个“ConSetBuffer”二进制文件可以专门执行此操作,我发现它可以可靠地工作。它和相关的控制台实用程序可在此页面上的“conutils.zip”链接中找到。
我为 Windows 编写了一个小型应用程序,允许“最大化”窗口和缓冲区。它可以很容易地扩展以允许使用自定义值传递参数。
这里有另一个变体:
/*
@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();
}
}
这个问题的答案不起作用,因为我收到关于发送到 PowerShell 命令的变量的错误,所以我修改了工作。
PowerShell 命令只是添加uiHeightBuffer
到uiHeight
变量以显示滚动条。
编辑:添加高度缓冲区作为第三个参数和 TRUE 或 FALSE 作为第四个参数以启用或禁用滚动条。
当在这种情况下不需要滚动条时,我发现这在退出带有小消息的脚本时很有用。
同样要启用 UTF-8 编码,您必须在 `:CMDSIZE' 调用的开头设置默认值并在结尾设置它,否则,字体大小会有点滑稽。
如果您不想影响这一点,则省略chcp 850 >NUL &
and是您会做的。chcp 65001 >NUL &
这适用于Version: 1909
Windows 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
我找到了一种在不影响窗口大小的情况下调整缓冲区大小的方法。由于批处理工作方式的缺陷,它可以工作,但它可以完成工作。
mode 648 78 >nul 2>nul
它是如何工作的?该命令存在语法错误,应为“mode 648, 78”。由于批处理的工作方式,缓冲区大小将首先调整为 648,然后窗口调整大小会出现,但由于语法错误,它永远不会完成。瞧,缓冲区大小已调整,窗口大小保持不变。这会产生一个丑陋的错误,所以要摆脱它,只需添加“>nul 2>nul”就可以了。