我最近了解到我可以使用mode x,y
控制运行程序的CMD窗口的大小。然而,我刚才注意到这设置了缓冲区大小,窗口将调整为匹配或最大屏幕大小。
我想使用mode 100,50
作为窗口大小,但我也希望保留一个arger缓冲区 - 至少我希望开发mode 100,9999
。
有没有办法做到这一点?
答案 0 :(得分:26)
我认为没有一个本机批处理命令可以独立控制缓冲区和窗口大小。 .NET可以控制两者,但我不认为VBScript或JScript可以访问该功能。但是powershell可以:-)见How Can I Expand the Width of the Windows PowerShell Console?
值得庆幸的是,当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
答案 1 :(得分: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();
}
}
答案 2 :(得分:0)
有一个'ConSetBuffer'二进制可用,具体做到这一点,我发现它可靠地工作。它可以通过'conutils.zip'链接on this page获得它和相关的控制台实用程序。
答案 3 :(得分:0)
我为Windows写了一个小application,允许“最大化”窗口和缓冲区。可以很容易地扩展它以允许使用自定义值传递参数。
答案 4 :(得分:0)
这个问题的答案没有用,因为我收到了有关发送到PowerShell命令的变量的错误消息,所以我进行了修改。
PowerShell命令只需将uiHeightBuffer
添加到uiHeight
变量中即可显示滚动条。
编辑:添加了高度缓冲区作为第三个参数,并将TRUE或FALSE作为第四个参数来启用或禁用滚动条。
在这种情况下不需要滚动条时,退出带有小消息的脚本时,我发现这很有用。
要启用UTF-8编码,您还必须在`:CMDSIZE'调用的开始处设置默认值,并在结尾处进行设置,否则字体大小会变得有些滑稽。
如果不想影响此操作,则忽略chcp 850 >NUL &
和chcp 65001 >NUL &
。
这适用于Windows 10的Version: 1909
。
@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
答案 5 :(得分:-1)
我找到了一种在不影响窗口大小的情况下调整缓冲区大小的方法。它的工作原理归功于批处理的工作方式,但它完成了工作。
mode 648 78 >nul 2>nul
它是如何工作的?此命令中存在语法错误,它应为“mode 648,78”。由于批处理的工作方式,缓冲区大小将首先调整为648,然后窗口调整大小将会到来,但由于语法错误,它将永远不会完成。 Voila,调整缓冲区大小,窗口大小保持不变。这会产生一个丑陋的错误,所以要摆脱它只需添加“&gt; nul 2&gt; nul”就可以了。