Как найти минимальную ширину экрана BufferWidth в PowerShell? - PullRequest
2 голосов
/ 17 января 2012

Я могу использовать $ host.UI.RawUI.MaxPhysicalWindowSize.Width, чтобы получить максимальную ширину (то есть количество столбцов) для командного окна PowerShell, а настройка размера командного окна PowerShell хорошо документирована, но минимальный буфер ширина, кажется, варьируется между машинами. На одной машине было 13, а на другой - 14. Я могу установить минимальную высоту и ширину окна на 1, а минимальная высота буфера также может быть 1.

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

Ответы [ 2 ]

4 голосов
/ 17 января 2012

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

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

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

В качестве примера: вот как получить минимальную ширину экрана консоли. Я P / Вызываю функцию GetSystemMetrics из User32.dll, используя эту расширенную функцию (New-PInvoke от 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, представляет собой общую ширину (включая границы) экрана консоли.

0 голосов
/ 17 января 2012

Может быть, я не прав, но с

[system.console]::BufferWidth 

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

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

...