【发布时间】:2013-02-05 09:03:23
【问题描述】:
如何在批处理文件的环境变量中获取 Windows 控制台的当前宽度?
【问题讨论】:
标签: windows command-line batch-file console cmd
如何在批处理文件的环境变量中获取 Windows 控制台的当前宽度?
【问题讨论】:
标签: windows command-line batch-file console cmd
我喜欢在 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 管理器)。
【讨论】:
试试这个(语言/区域设置/.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 上测试,均使用捷克语
【讨论】:
Powershell 的(Get-Host).UI.RawUI.WindowSize 属性设置或返回当前控制台窗口的尺寸。因此,您可以使用for 循环捕获它:
for /f %%I in ('powershell ^(Get-Host^).UI.RawUI.WindowSize.width') do set width=%%I
【讨论】:
powershell (get-host).ui.rawui.windowsize.width。背景信息可在blogs.technet.com/b/heyscriptingguy/archive/2006/12/04/… 获得
好的,这是不需要安装 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%
【讨论】:
csc.exe 是否不存在。也就是说,我赞成极端编码!干得好。
.vb 作为源文件扩展名,但您的代码实际上是 C#。
您无法在环境变量中获取它,但它存储在注册表中,因此您可以从批处理脚本中访问它。
这里有关于如何更改它的答案: 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 的方式来设置当前窗口尺寸和缓冲区大小。我会看看我是否能找到类似的东西来读取尺寸而不是设置。
对于一个简单的行:
for /f tokens^=2 %%w in ('mode con^|find "Col"')do set _width=%%~w"
【讨论】: