CMD:独立于窗口高度设置缓冲区高度

CMD:独立于窗口高度设置缓冲区高度,cmd,Cmd,我最近了解到,我可以通过模式x,y控制运行程序的CMD窗口的大小。然而,我最近注意到,这设置了缓冲区大小,窗口将根据屏幕大小进行调整以匹配或最大输出 我想使用模式100,50作为窗口大小,但我还想保留一个更大的缓冲区-至少我想模式1009999 有什么方法可以做到这一点吗?我认为没有一个本机批处理命令可以独立控制缓冲区和窗口大小。NET可以控制两者,但我认为VBScript或JScript无法访问该功能。但是powershell可以:-)看到了吗 谢天谢地,当PowerShell退出时,新设置保

我最近了解到,我可以通过
模式x,y
控制运行程序的CMD窗口的大小。然而,我最近注意到,这设置了缓冲区大小,窗口将根据屏幕大小进行调整以匹配或最大输出

我想使用
模式100,50
作为窗口大小,但我还想保留一个更大的缓冲区-至少我想
模式1009999


有什么方法可以做到这一点吗?

我认为没有一个本机批处理命令可以独立控制缓冲区和窗口大小。NET可以控制两者,但我认为VBScript或JScript无法访问该功能。但是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
这里是另一个变体:

/*
@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();
     }
  }

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

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

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

mode 648 78 >nul 2>nul

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

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

PowerShell命令只需将
uiHeightBuffer
添加到
uiHeight
变量中,即可显示滚动条


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

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

此外,要启用UTF-8编码,您必须在“:CMDSIZE”调用开始时设置默认值,并在末尾设置它,否则字体大小会变得有点滑稽

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

这适用于Windows 10的
版本: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
@echo关闭
标题%nx0
rem基于此线程:https://stackoverflow.com/a/13351373
转到我的例行程序
:CMDSIZE
chcp 850>NUL&设置“uiWidth=%1”并设置“uiHeight=%2”
模式%ui宽度%,%ui高度%
如果%4==TRUE(设置/a“uiHeightBuffer=uiHeight+%3”)
如果%4==TRUE(powershell.exe-ExecutionPolicy Bypass-命令“&{$H=get host;$W=$H.ui.rawui;$B=$W.buffersize;$B.width=%uiWidth%;$B.height=%uiHeightBuffer%;$W.buffersize=$B}”)
如果%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
:我的例行程序
调用:CMDSIZE 255 44 222 TRUE
在这里做你的日常工作。。。
在这里做你的例行公事。。。
回音/暂停(&P)
后藤:真的吗
:Exiturotine
调用:CMDSIZE 40 2 0错误
标题正在退出例行消息。。。
回显正在退出的例程消息。。。
设置/p“=”编号并退出

EDIT-修复了一个愚蠢的错误。在一个应该是$BIs PowerShell的地方有$BS,这是所有Windows用户都会有的,还是它需要安装?它是Vista以后所有版本的标准配置。它不是XP的标准配置,但可以下载。听起来很完美。遗憾的是CMD中没有本机解决方案,但很高兴知道有一个足够简单的替代方案。不过,第一个参数是水平缓冲区,所以即使它起作用(它不…),它也只会提供水平调整大小,不是吗?在Win7上对我根本不起作用。它只给出了错误消息,并且在Windows 10上没有更改缓冲区大小(既不是水平的也不是垂直的),这非常有效:
模式con:cols=160行=60缓冲区=1000
@KlaymenDK在Windows 10上我得到了
在哪个平台上编写的“无效参数-buffer=1000”
脚本?有用的工具,虽然很不幸,但同一个软件包也不包括修改窗口屏幕大小(独立于窗口缓冲区大小)的工具。