Как найти минимальную ширину буфера экрана в PowerShell?


Я могу использовать $host.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.Равуи.MaxPhysicalWindowSize.Ширина чтобы получить максимальную ширину (то есть количество столбцов) для окна командной строки PowerShell, и установка размера окна командной строки PowerShell хорошо документированы, но минимальная ширина буфера, кажется, различается между машинами. На одной машине было 13, а на другой-14. Я могу установить минимальную высоту и ширину окна на 1, а минимальная высота буфера также может быть 1.

Кто-нибудь знает, как я могу получить этот минимальный буфер значение ширины программно (без просто пробовать значения и ловить исключения!)

2 2

2 ответа:

Поскольку параметр $host.UI.RawUI.BufferSize влияет на буфер экрана консоли ( Командная строка -> свойства -> макет -> размер буфера экрана изменяется при изменении $host.UI.RawUI.BufferSize), он имеет те же ограничения на размер буфера, что и экран консоли.

Как мы можем прочитать здесь, указанные размеры для размера буфера не могут быть меньше минимального размера, разрешенного системой. Этот минимум зависит от текущего размера шрифта для консоли (выбранного пользователем) и SM_CXMIN и значения SM_CYMIN, возвращаемые функциейGetSystemMetrics .

Одним из следствий этого является то, что чем больше Шрифт экрана консоли, тем меньше размер буфера.

В качестве примера: вот как получить минимальную ширину экрана консоли. Я П/вызова функции getsystemmetrics от библиотека user32.dll с использованием этой расширенной функции (New-PInvoke by Joel Bennett).

$SM_CXMIN =28 # "The minimum width of a window, in pixels." enum value
New-PInvoke -Library User32.dll -Signature "int GetSystemMetrics(uint Metric)"
GetSystemMetrics $SM_CXMIN # returns 132 on my system

Для получения размера шрифта, используемого экраном консоли буфер, попробуйте GetConsoleFontSize из kernel32.файл DLL.

Примечание:

Значение, возвращаемое GetSystemMetrics $SM_CXMIN, - это общая ширина (включая границы) экрана консоли.

Может быть, я ошибаюсь, но с

[system.console]::BufferWidth 

Вы получаете фактический размер ширины буфера.

Это значение не может быть меньше текущего размера [System.Console]::WindowWidth (вызовет исключение).