【问题标题】:Way to find CMD window size from batch (*.bat) and maybe buffer size?从批处理(* .bat)和缓冲区大小中查找 CMD 窗口大小的方法?
【发布时间】:2020-09-29 21:59:49
【问题描述】:

我想制作一个 *.bat 文件,它可以根据 CMD 的窗口大小而有所不同。

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

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

这是我最感兴趣的。 但同样有趣的是一种方法可以在其中找到正在运行的 *.bat 的缓冲区大小。

有什么方法或想法可以从 *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%

这将从注册表中读取每行的行数和字符数。 它是https://superuser.com/questions/1330772/cmd-window-size的缩写形式

【问题讨论】:

    标签: batch-file cmd window size buffer


    【解决方案1】:

    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 显示的窗口高度值不正确,您或许可以使用 HKCU\Console 的 WindowSize 注册表值:

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

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

    【讨论】:

    • 看起来令人惊讶......我得到的输出是“窗口是 x,缓冲区为 300”...... 300 实际上是缓冲区大小......但在“x”之前和之后有些东西失踪...也许是因为 Windows 7? ..“more con”确实说“buffer 300, cols 80, refresh 31, delay 1, codepage 850” .. 没有关于行的...但是注册表技巧看起来很有趣...有一个值“CursorSize”并且它是“25”,这可能是行,因为我实际上数了 25 行...谢谢到目前为止..
    • @Mugolumbu - 我无法在我的 Windows 7 VM 中复制您的问题。我唯一能想到的是您的mode con 不是英文的,因此您需要将“行”和“列”更改为mode con 在您的机器上报告的第一行和第二行。
    • 完全正确..它不是英语......这是一个重要的提示......现在我得到“窗口是 80x300,缓冲区为 300”......我需要的是“窗口是 80x25,缓冲区为 300”......到目前为止,这一切都非常有趣......只是窗口高度不正确......我手动计算了我在窗口中看到的 25 行......并且如果我上下滚动 300 行似乎是我所看到的......但它本身的窗口是 25 行......知道如何获得这个数字吗?
    • @Mugolumbu - 我添加了另一种方法来获取答案中的窗口高度。请看看它是否适合你。
    • 完美......神奇的数字 25 正在弹出......它的工作原理......非常感谢:D 现在我知道了从窗口宽度到高度到缓冲区长度的每件事......而且我们在 cmets 中有所有信息...甚至是带有不同语言的 cmd 输出的非常好的提示...太好了,我认为您的答案是最好的;) .. 哦,遗憾的是,我没有足够的分数来投票给您。 ..但我确实点击了你
    【解决方案2】:

    您可以使用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 方法取决于区域设置!

    为了避免这种情况,你可以使用这个:

    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%
    

    实际窗口大小参考SomethingDarkanswerreg query的使用方法)。

    【讨论】:

      【解决方案3】:

      为此, 可以利用 实现此目的:

      "%__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
      

      这意味着如果您希望将这些值作为变量,在您的 中,您可以在 中运行命令并使用 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

      【讨论】:

        猜你喜欢
        • 2013-05-25
        • 1970-01-01
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-10
        • 2018-09-19
        相关资源
        最近更新 更多