从批处理 (*.bat) 和缓冲区大小中查找 CMD window 大小的方法?
Way to find CMD window size from batch (*.bat) and maybe buffer size?
我想制作一个 *.bat 文件,它可以根据 CMD 的 window 大小进行不同的操作。
我搜索了一种找到 window 尺寸的方法,它大部分是相同的,但有时当人们自定义设置时它不一样。
通常 window 大小为 80 个字符宽度和 25 行高度。
但是有些应用了他们自己的自定义设置,所以它可以是任何其他东西。
有没有办法从 *.bat 内部找到实际的 window 大小?
我想尽可能多地保留 *.bat ...换句话说,不是 PowerShell 或 vbs 等等,最好也没有 *.tmp 文件。
我最感兴趣的是这个。
但同样有趣的是一种在其中找到 运行 *.bat 的缓冲区大小的方法。
有什么方法或想法可以从 *bat 内部获取此信息吗?
替代方案可能是调整 window 大小或来自 *.bat 文件的缓冲区大小。
因此,如果我无法获得实际的 window 或缓冲区大小,是否可以在处理时在 运行 *.bat 中设置 window 或缓冲区大小?
有没有人知道如何从 运行 *.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%
这将从注册表中读取行和每行的字符。
它是 https://superuser.com/questions/1330772/cmd-window-size
的缩写形式
在 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%
如果 Lines 显示的 window 高度值不正确,您可以使用 HKCU\Console:
的 WindowSize 注册表值
for /f "tokens=3" %%A in ('reg query HKCU\Console /v WindowSize') do set /a window_height=%%A/65535
重要的是要注意这只是控制台的默认高度而不是当前高度,但是如果使用 mode con
更改了高度,那么缓冲区大小将被覆盖并且第一种方式会工作。
为了这个,一个batch-file or cmd could leverage powershell:
"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "$HW=(Get-Host).UI.RawUI;'Window size = '+$HW.WindowSize;'Buffer size = '+$HW.BufferSize"
这应该提供类似于以下的输出,(其中第一个数字是宽度,第二个数字是高度):
Window size = 80,30
Buffer size = 80,120
显然您可以根据您的具体要求调整输出,例如
"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "$HW=(Get-Host).UI.RawUI;'WinWxH='+$HW.WindowSize -Replace ',','x';'BufWxH='+$HW.BufferSize -Replace ',','x'"
示例输出:
WinWxH=80x30
BufWxH=80x120
这意味着如果您希望将这些值作为变量,在您的 batch-file, you could run the command within a for-loop 中并使用 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"
在这种情况下,您的变量将是 %WinWxH%
,定义值为 80x30
,%BufWxH%
,定义值为 80x120
。
您可以使用 mode con
以字符为单位获取缓冲区大小:
for /F "tokens=1* delims=: " %%I in ('
mode con ^| findstr "Lines Columns"
') do set "%%I=%%J"
echo Lines=%Lines%
echo Columns=%Columns%
请注意,此类 mode con
方法是 locale-dependent!
为避免这种情况,您可以使用:
rem // Ensure variables are empty:
set "Lines=" & set "Columns="
rem /* Skip over header lines and use `:` as the only delimiter, because
rem keywords may contain spaces on their own in other languages: */
for /F "skip=2 tokens=1* delims=:" %%I in ('mode con') do (
rem // Remove surrounding spaces from extracted value:
for /F %%K in ("%%J") do (
if not defined Lines (
rem // First value after header line is supposed to be lines:
set "Lines=%%K"
) else if not defined Columns (
rem // Second value after header line is supposed to be columns:
set "Columns=%%K"
)
)
)
echo Lines=%Lines%
echo Columns=%Columns%
实际window尺寸参考SomethingDark's (如何使用reg query
)。
我想制作一个 *.bat 文件,它可以根据 CMD 的 window 大小进行不同的操作。
我搜索了一种找到 window 尺寸的方法,它大部分是相同的,但有时当人们自定义设置时它不一样。 通常 window 大小为 80 个字符宽度和 25 行高度。 但是有些应用了他们自己的自定义设置,所以它可以是任何其他东西。
有没有办法从 *.bat 内部找到实际的 window 大小? 我想尽可能多地保留 *.bat ...换句话说,不是 PowerShell 或 vbs 等等,最好也没有 *.tmp 文件。
我最感兴趣的是这个。 但同样有趣的是一种在其中找到 运行 *.bat 的缓冲区大小的方法。
有什么方法或想法可以从 *bat 内部获取此信息吗?
替代方案可能是调整 window 大小或来自 *.bat 文件的缓冲区大小。 因此,如果我无法获得实际的 window 或缓冲区大小,是否可以在处理时在 运行 *.bat 中设置 window 或缓冲区大小?
有没有人知道如何从 运行 *.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%
这将从注册表中读取行和每行的字符。 它是 https://superuser.com/questions/1330772/cmd-window-size
的缩写形式在 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%
如果 Lines 显示的 window 高度值不正确,您可以使用 HKCU\Console:
的 WindowSize 注册表值for /f "tokens=3" %%A in ('reg query HKCU\Console /v WindowSize') do set /a window_height=%%A/65535
重要的是要注意这只是控制台的默认高度而不是当前高度,但是如果使用 mode con
更改了高度,那么缓冲区大小将被覆盖并且第一种方式会工作。
为了这个,一个batch-file or cmd could leverage powershell:
"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "$HW=(Get-Host).UI.RawUI;'Window size = '+$HW.WindowSize;'Buffer size = '+$HW.BufferSize"
这应该提供类似于以下的输出,(其中第一个数字是宽度,第二个数字是高度):
Window size = 80,30
Buffer size = 80,120
显然您可以根据您的具体要求调整输出,例如
"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "$HW=(Get-Host).UI.RawUI;'WinWxH='+$HW.WindowSize -Replace ',','x';'BufWxH='+$HW.BufferSize -Replace ',','x'"
示例输出:
WinWxH=80x30
BufWxH=80x120
这意味着如果您希望将这些值作为变量,在您的 batch-file, you could run the command within a for-loop 中并使用 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"
在这种情况下,您的变量将是 %WinWxH%
,定义值为 80x30
,%BufWxH%
,定义值为 80x120
。
您可以使用 mode con
以字符为单位获取缓冲区大小:
for /F "tokens=1* delims=: " %%I in ('
mode con ^| findstr "Lines Columns"
') do set "%%I=%%J"
echo Lines=%Lines%
echo Columns=%Columns%
请注意,此类 mode con
方法是 locale-dependent!
为避免这种情况,您可以使用:
rem // Ensure variables are empty:
set "Lines=" & set "Columns="
rem /* Skip over header lines and use `:` as the only delimiter, because
rem keywords may contain spaces on their own in other languages: */
for /F "skip=2 tokens=1* delims=:" %%I in ('mode con') do (
rem // Remove surrounding spaces from extracted value:
for /F %%K in ("%%J") do (
if not defined Lines (
rem // First value after header line is supposed to be lines:
set "Lines=%%K"
) else if not defined Columns (
rem // Second value after header line is supposed to be columns:
set "Columns=%%K"
)
)
)
echo Lines=%Lines%
echo Columns=%Columns%
实际window尺寸参考SomethingDark's reg query
)。