Batch file 如何从批(*.bat)中找到CMD窗口大小,可能还有缓冲区大小?

Batch file 如何从批(*.bat)中找到CMD窗口大小,可能还有缓冲区大小?,batch-file,cmd,window,size,buffer,powershell,for-loop,Batch File,Cmd,Window,Size,Buffer,Powershell,For Loop,我想制作一个*.bat文件,它可以根据CMD的窗口大小进行不同的操作 我搜索了一种方法来查找窗口大小,它基本上是相同的,但有时当人们自定义设置时,它是不一样的。 通常,窗口大小为80个字符宽,25行高。 但有些应用了自己的自定义设置,因此它可以是其他任何东西 有没有办法从*.bat内部找到实际的窗口大小? 我想尽可能多地保留它*.bat。。。换句话说,不要使用PowerShell或vbs等,最好不要使用*.tmp文件 这将使我最感兴趣。 但另一个有趣的方法是找到运行中的*.bat自身的缓冲区大小

我想制作一个*.bat文件,它可以根据CMD的窗口大小进行不同的操作

我搜索了一种方法来查找窗口大小,它基本上是相同的,但有时当人们自定义设置时,它是不一样的。 通常,窗口大小为80个字符宽,25行高。 但有些应用了自己的自定义设置,因此它可以是其他任何东西

有没有办法从*.bat内部找到实际的窗口大小? 我想尽可能多地保留它*.bat。。。换句话说,不要使用PowerShell或vbs等,最好不要使用*.tmp文件

这将使我最感兴趣。 但另一个有趣的方法是找到运行中的*.bat自身的缓冲区大小

有没有办法或想法从蝙蝠内部获取这些信息

另一种方法可能是根据*.bat文件自行调整窗口大小或缓冲区大小。 因此,如果我无法获得实际的窗口或缓冲区大小,是否可以在运行*.bat时设置窗口或缓冲区大小

有没有人对如何从正在运行的*.bat内部获取或设置这些信息有什么窍门或想法

到目前为止,我还不知道这是否可能以及如何实现? 所以我不能尝试我现在能展示的东西

更新:

REM Empty Variables
set "ROWS="
set "CHARACTERS="
REM Read CMD Window Size in Rows and Characters per Row.
for /F "tokens=3" %%A in ('reg query HKCU\Console /v WindowSize') do set /A ROWS=%%A/65535
for /F "tokens=3" %%A in ('reg query HKCU\Console /v WindowSize') do set /A "CHARACTERS=%%A&0xffff
REM Test it ...
echo %ROWS%
echo %CHARACTERS%
这将从注册表中读取每行的行数和字符数。 它是

的缩写,行和列(分别为高度和宽度)都可以在
mode con
命令的输出中找到。不幸的是,屏幕缓冲区大小是在注册表中找到的,并且由于某种原因被乘以65535后存储

@echo off
for /f "tokens=2" %%A in ('mode con ^| find "Lines"') do set "window_height=%%A"
for /f "tokens=2" %%A in ('mode con ^| find "Columns"') do set "window_width=%%A"
for /f "tokens=3" %%A in ('reg query HKCU\Console /v ScreenBufferSize') do set /a window_buffer=%%A/65535

echo Window is %window_width%x%window_height% with a buffer of %window_buffer%
如果行显示的窗口高度值不正确,则可以使用HKCU\Console的WindowsSize注册表值:

for /f "tokens=3" %%A in ('reg query HKCU\Console /v WindowSize') do set /a window_height=%%A/65535
重要的是要注意,这只是控制台的默认高度,而不是当前高度,但是如果使用
模式con
更改高度,则缓冲区大小将被覆盖,第一种方式将工作。

行和列(分别为高度和宽度)可在
模式con
命令的输出中找到。不幸的是,屏幕缓冲区大小是在注册表中找到的,并且由于某种原因被乘以65535后存储

@echo off
for /f "tokens=2" %%A in ('mode con ^| find "Lines"') do set "window_height=%%A"
for /f "tokens=2" %%A in ('mode con ^| find "Columns"') do set "window_width=%%A"
for /f "tokens=3" %%A in ('reg query HKCU\Console /v ScreenBufferSize') do set /a window_buffer=%%A/65535

echo Window is %window_width%x%window_height% with a buffer of %window_buffer%
如果行显示的窗口高度值不正确,则可以使用HKCU\Console的WindowsSize注册表值:

for /f "tokens=3" %%A in ('reg query HKCU\Console /v WindowSize') do set /a window_height=%%A/65535

重要的是要注意,这只是控制台的默认高度,而不是当前高度,但是如果使用
模式con
更改了高度,则缓冲区大小将被覆盖,第一种方式将工作。

仅出于此目的,or可以利用:

“%\uuuu AppDir\uuuuu%WindowsPowerShell\v1.0\powershell.exe”-NoP“$HW=(获取主机).UI.RawUI;'WindowSize='+$HW.WindowSize;'Buffer size='+$HW.BufferSize”
这应提供与以下类似的输出(其中第一个数字是宽度,第二个数字是高度):

窗口大小=80,30
缓冲区大小=80120

显然,您可以根据自己的具体需求调整输出,例如:

“%\uuuuuAppDir\uuuuuu%WindowsPowerShell\v1.0\powershell.exe”-NoP“$HW=(获取主机).UI.RawUI;'WinWxH='+$HW.WindowSize-Replace','x';'BufWxH='+$HW.BufferSize-Replace','x'”
示例输出:

WinWxH=80x30
BufWxH=80x120
这意味着,如果您希望将这些值作为变量,您可以在中运行命令,并使用
Set
保存输出:

@For/F Delims^=%%G In('PowerShell-NoP“$HW=(Get Host).UI.RawUI;'WinWxH='+$HW.WindowSize-Replace','x';'BufWxH='+$HW.BufferSize-Replace','x')Do@Set%%G”

在这种情况下,您的变量将是定义值为
80x30
%WinWxH%
,以及定义值为
80x120
%BufWxH%
,或者可以利用以下方法:

“%\uuuu AppDir\uuuuu%WindowsPowerShell\v1.0\powershell.exe”-NoP“$HW=(获取主机).UI.RawUI;'WindowSize='+$HW.WindowSize;'Buffer size='+$HW.BufferSize”
这应提供与以下类似的输出(其中第一个数字是宽度,第二个数字是高度):

窗口大小=80,30
缓冲区大小=80120

显然,您可以根据自己的具体需求调整输出,例如:

“%\uuuuuAppDir\uuuuuu%WindowsPowerShell\v1.0\powershell.exe”-NoP“$HW=(获取主机).UI.RawUI;'WinWxH='+$HW.WindowSize-Replace','x';'BufWxH='+$HW.BufferSize-Replace','x'”
示例输出:

WinWxH=80x30
BufWxH=80x120
这意味着,如果您希望将这些值作为变量,您可以在中运行命令,并使用
Set
保存输出:

@For/F Delims^=%%G In('PowerShell-NoP“$HW=(Get Host).UI.RawUI;'WinWxH='+$HW.WindowSize-Replace','x';'BufWxH='+$HW.BufferSize-Replace','x')Do@Set%%G”

在这种情况下,您的变量将是定义值为
80x30
%WinWxH%
,以及定义值为
80x120
%BufWxH%
,您可以使用
模式con
以字符为单位获取缓冲区大小:

for/F“tokens=1*delims=:”%%I in('
模式con^ findstr“行-列”
“)是否设置“%%I=%%J”
回音线=%Lines%
回显列=%Columns%
请注意,这种
模式con
方法依赖于语言环境

为了避免这种情况,您可以使用以下方法:

rem//确保变量为空:
设置“行=”&设置“列=”
rem/*跳过标题行,使用“:”作为唯一的分隔符,因为
rem关键字在其他语言中可能单独包含空格:*/
对于/F“跳过=2个令牌=1*delims=:”%%I in('mode con')do(
rem//从提取的值中删除周围空间:
对于/F%%K in(%%J”)do(
如果没有定义行(