【问题标题】:Windows console width in environment variable环境变量中的 Windows 控制台宽度
【发布时间】:2013-02-05 09:03:23
【问题描述】:

如何在批处理文件的环境变量中获取 Windows 控制台的当前宽度

【问题讨论】:

    标签: windows command-line batch-file console cmd


    【解决方案1】:

    我喜欢在 Windows 中使用内置 mode 命令的方法。 试试下面的批处理文件:

    @echo off
    for /F "usebackq tokens=2* delims=: " %%W in (`mode con ^| findstr Columns`) do set CONSOLE_WIDTH=%%W
    echo Console is %CONSOLE_WIDTH% characters wide
    

    请注意,这将返回控制台缓冲区的大小,而不是窗口(可滚动)的大小。

    如果您想要 Windows 控制台的高度,可以将 findstr 表达式中的 Columns 替换为 Lines。同样,它会返回缓冲区的高度,而不是窗口...我个人喜欢有一个大缓冲区来允许回滚历史,所以对我来说,Lines 通常报告大约 3000 :)


    只是为了好玩,这里有一个不使用findstr 过滤输出的版本...以防(出于某种原因)你不喜欢findstr

    @echo off
    for /F "usebackq tokens=1,2* delims=: " %%V in (`mode con`) do (
        if .%%V==.Columns (
            set CONSOLE_WIDTH=%%W
            goto done
        )
    )
    :done
    echo Console is %CONSOLE_WIDTH% characters wide
    

    注意,这一切都在 Windows XP SP3 中尝试过,在许多不同的窗口中(包括一个正在执行的 FAR 管理器)。

    【讨论】:

    • 如果系统使用除英语以外的任何其他语言,此方法会崩溃。如果您想要语言独立,请查看@user2475020 的答案。
    【解决方案2】:

    试试这个(语言/区域设置/.net 无关):

    @ECHO OFF
    SET "ConsoleWidth="
    SET /A LINECOUNT=0
    SETLOCAL ENABLEDELAYEDEXPANSION
    FOR /F "tokens=1,2,*" %%A IN ('mode con') DO (SET /A LINECOUNT=!LINECOUNT!+1&IF !LINECOUNT! EQU 4 SET ConsoleWidth=%%B)
    SETLOCAL DISABLEDELAYEDEXPANSION
    SET "LINECOUNT="
    ECHO ConsoleWidth: %ConsoleWidth% characters
    

    在 Windows XP 和 Windows 7 上测试,均使用捷克语

    【讨论】:

      【解决方案3】:

      Powershell 的(Get-Host).UI.RawUI.WindowSize 属性设置或返回当前控制台窗口的尺寸。因此,您可以使用for 循环捕获它:

      for /f %%I in ('powershell ^(Get-Host^).UI.RawUI.WindowSize.width') do set width=%%I
      

      【讨论】:

      • 这假设已安装 powershell,但对于 XP 用户可能并非如此。
      • +1,powershell命令可以简单到powershell (get-host).ui.rawui.windowsize.width。背景信息可在blogs.technet.com/b/heyscriptingguy/archive/2006/12/04/… 获得
      • @AxelFontaine - 我认为没有纯批处理解决方案。这些信息是通过 .NET 公开的,据我所知,Powershell 是唯一可以访问 .NET 的本机脚本语言。不幸的是,您是对的,Powershell 可能无法在 XP 机器上使用。
      • 这是来自 Microsoft 的更好参考:technet.microsoft.com/en-us/library/ee156814.aspx。埋在其中说明了 PowerShell 如何通过 .NET 访问属性
      • @AxelFontaine - 挑战:接受。见我的other answer
      【解决方案4】:

      好的,这是不需要安装 powershell 的。它编写、运行和删除 .Net 应用程序以设置批处理脚本变量。 :)

      @echo off
      setlocal
      pushd "%windir%\microsoft.net\"
      for /f "delims=" %%I in ('dir /s /b csc.exe') do (
          set csc=%%I
          goto next
      )
      :next
      popd
      echo using System;>width.cs
      echo class Width {>>width.cs
      echo public static void Main() {>>width.cs
      echo string m1 = "{0}";>>width.cs
      echo Console.WriteLine^(m1, Console.WindowWidth^); } }>>width.cs
      "%csc%" /out:width.exe width.cs >NUL 2>NUL
      for /f %%I in ('width.exe') do set width=%%I
      del width.exe width.cs
      echo %width%
      

      【讨论】:

      • 这个答案依赖于安装.Net,并且不检查csc.exe 是否不存在。也就是说,我赞成极端编码!干得好。
      • 这行得通...但有点令人困惑,因为您使用 .vb 作为源文件扩展名,但您的代码实际上是 C#。
      • 是的,我开始用 vb 编写它,但切换到 c#。我不想编辑文件扩展名,但我会继续做,因为有人注意到了。 :)
      【解决方案5】:

      您无法在环境变量中获取它,但它存储在注册表中,因此您可以从批处理脚本中访问它。

      这里有关于如何更改它的答案: How to change Screen buffer size in Windows Command Prompt from batch script

      以类似的方式,您可以使用reg.exe QUERY [key details] 而不是reg.exe ADD [details]。有关详细信息,请参阅Technet documentation for HKCU\Console

      【讨论】:

      • 这如何与多个控制台和多个宽度一起工作?我如何知道哪个键适用于我当前的控制台(而不是简单的新控制台的默认宽度)?
      • 当我开始工作时,我将链接到hkcu\console\windowsize 的技术网文章。另外,我知道有一种类似 powershell 的方式来设置当前窗口尺寸和缓冲区大小。我会看看我是否能找到类似的东西来读取尺寸而不是设置。
      • @rojo:关于我使用 powershell 方法链接到的问题,您已经给出了答案。
      【解决方案6】:

      对于一个简单的行:

      for /f tokens^=2 %%w in ('mode con^|find "Col"')do set _width=%%~w"
      

      【讨论】:

        猜你喜欢
        • 2015-07-27
        • 1970-01-01
        • 2012-10-21
        • 2020-05-19
        • 2013-02-28
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多