Как изменить размер экранного буфера в командной строке Windows из пакетного скрипта - PullRequest
50 голосов
/ 14 января 2011

Я знаю, что вы можете щелкнуть правой кнопкой мыши свойства -> макет и изменить его вручную.

Но как бы вы изменили его из пакетного скрипта Windows?

Я знаю, что вы можетеизмените его размер из скрипта, используя что-то вроде этого

MODE CON: COLS=90 LINES=10

Но как вы можете изменить размер буфера?

Скрипт будет работать некоторое время, а иногда и до сбояи выход занимает некоторое время, поэтому мне нужен больший буфер.

Ответы [ 12 ]

57 голосов
/ 25 апреля 2011

Я просто искал ответ на этот точный вопрос, пришел узнать, что команда сама настраивает буфер!

mode con:cols=140 lines=70

Часть lines = 70 фактически регулирует высотув настройке «Размер буфера экрана», а НЕ «Высота» в настройке «Размер окна».

Это легко проверить, выполнив команду с параметром 'lines = 2500' (или любым другим буфером, который вы хотите), а затемпроверив «Свойства» окна, вы увидите, что буфер теперь действительно установлен на 2500.

Мой пакетный скрипт выглядит примерно так:

@echo off
cmd "mode con:cols=140 lines=2500"
43 голосов
/ 08 января 2012

Я только что попробовал макс. Строк в Windows 7, я могу установить с помощью команды mode con и нашел его равным 32766 2 ^ 15-2, и вы можете установить его с помощью следующей команды

mode con lines=32766

, хотя вы также можете установить размер экранного буфера из графического интерфейса, но максимум, который вы можете получить, составляет 9999.

12 голосов
/ 30 сентября 2012
mode con lines=32766

устанавливает буфер, но также увеличивает высоту окна до полного экрана, что ужасно.

Вы можете изменить настройки непосредственно в реестре:

:: escape the environment variable in the key name
set mySysRoot=%%SystemRoot%%

:: 655294544 equals 9999 lines in the GUI
reg.exe add "HKCU\Console\%mySysRoot%_system32_cmd.exe" /v ScreenBufferSize /t REG_DWORD /d 655294544 /f

:: We also need to change the Window Height, 3276880 = 50 lines
reg.exe add "HKCU\Console\%mySysRoot%_system32_cmd.exe" /v WindowSize /t REG_DWORD /d 3276880 /f

следующий cmd.exe, который вы запускаете, имеет буфер увеличения.

Так что это не работает для cmd.exe, в котором вы уже находитесь, но просто используйте его в pre-batch.cmd, который затем вызывает ваш основной скрипт.

7 голосов
/ 14 января 2011

Ниже приведена очень простая программа на VB.NET, которая будет делать то, что вы хотите.

Она установит для буфера ширину 100 символов и высоту 1000 символов.Затем он устанавливает ширину окна в соответствии с размером буфера.

Module ConsoleBuffer
  Sub Main()
    Console.WindowWidth = 100
    Console.BufferWidth = 100
    Console.BufferHeight = 1000
  End Sub
End Module

UPDATE

Я изменил код, чтобы сначала установить Console.WindowWidth, а затем установить Console.BufferWidth, потому что если вы попытаетесьчтобы установить для Console.BufferWidth значение меньше текущего Console.WindowWidth, программа выдаст исключение.

Это всего лишь пример ... Вы должны добавить код для обработки параметров командной строки и обработки ошибок.

5 голосов
/ 24 января 2013

Существует решение на CMD: установить высоту буфера независимо от высоты окна , эффективно используя команду powershell, выполняемую из пакетного сценария. Это решение позволило мне изменить размер буфера прокрутки в существующем окне пакетного сценария независимо от размера окна, в точности так, как запрашивал OP.

Предостережение: кажется, что сценарий забывает переменные (или, по крайней мере, так было с моим сценарием), поэтому я рекомендую вызывать команду только в начале и / или конце вашего сценария, или в противном случае, если вы не зависите на локальную переменную сеанса.

3 голосов
/ 22 апреля 2015

Вот что я сделал на случай, если кто-то найдет это полезным (я использовал много вещей в соответствии с остальными ответами в этой теме) :

Сначала я настроил параметры макетапо мере необходимости.Это сразу меняет размер окна, чтобы было проще установить нужный размер. Кстати, я не знал, что у меня также может быть видимая ширина меньше ширины буфера.Это было хорошо, так как я обычно ненавижу оборачивать длинную строку. enter image description here

Затем, после нажатия кнопки ОК, я открыл regedit.exe и перешел в "HKEY_CURRENT_USER \ Console".Там есть новая дочерняя запись "% SystemRoot% _system32_cmd.exe".Я щелкнул правой кнопкой мыши на этом и выбрал Экспорт: enter image description here

Я сохранил это как "cmd_settings.reg".Затем я создал пакетный скрипт, который импортирует эти настройки, вызывает мой оригинальный пакетный скрипт (имя batch_script.bat) и затем удаляет то, что я импортировал, чтобы окно командной строки вернулось к настройкам по умолчанию:

regedit /s cmd_settings.reg
start /wait batch_script.bat
reg delete "HKEY_CURRENT_USER\Console\%%SystemRoot%%_system32_cmd.exe" /f

Это пример пакета, который может быть вызван ("batch_script.bat"):

@echo off
echo test!
pause
exit

Не забудьте команду выхода в конце вашего скрипта, если вы хотите, чтобы строка reg delete былазапустить после выполнения скрипта.

2 голосов
/ 14 января 2011

Нет "командной строки DOS". DOS полностью умер с Windows ME ( 7/11 / 2006 ). Он просто называется командной строкой в ​​Windows NT (NT, 2K, XP, Vista, 7).

Нет способа изменить экранный буфер с помощью встроенных команд cmd.exe. Его можно изменить с помощью Функции API консоли , поэтому вы можете создать утилиту для его изменения. Я никогда не пробовал это сам.

Другим предложением было бы перенаправить вывод как в файл, так и на экран, чтобы у вас была «бумажная копия». В Windows нет команды TEE, такой как Unix, но кто-то исправил это .

1 голос
/ 09 мая 2017

Размер буфера cmd можно изменить, щелкнув значок в верхнем левом углу -> свойства -> макет -> размер буфера экрана.
вы даже можете изменить его с помощью команды cmdmode con:cols=100 lines=60Upto lines = 58, высота окна cmd изменяется ..После значения строки 58 размер буфера cmd изменяется ...

1 голос
/ 16 января 2017

Если кому-то все еще интересно, в более новых версиях Windows вы можете использовать powershell:

powershell.exe -command "& {$pshost = Get-Host;$pswindow = $pshost.UI.RawUI;$newsize = $pswindow.BufferSize;$newsize.height = 150;$pswindow.buffersize = $newsize;}"
1 голос
/ 02 июля 2016

Я создал следующую утилиту для установки размера консоли и буферов прокрутки.

Я скомпилировал ее, используя DEV C ++ (http://www.bloodshed.net/devcpp.html).

Исполняемый файл включен в https://sourceforge.net/projects/wa2l-wintools/.

#include <iostream>
#include <windows.h> 

using namespace std;


// SetWindow(Width,Height,WidthBuffer,HeightBuffer) -- set console size and buffer dimensions
//
void SetWindow(int Width, int Height, int WidthBuffer, int HeightBuffer) { 
    _COORD coord; 
    coord.X = WidthBuffer; 
    coord.Y = HeightBuffer; 

    _SMALL_RECT Rect; 
    Rect.Top = 0; 
    Rect.Left = 0; 
    Rect.Bottom = Height - 1; 
    Rect.Right = Width - 1; 

    HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);      // Get Handle 
    SetConsoleScreenBufferSize(Handle, coord);            // Set Buffer Size 
    SetConsoleWindowInfo(Handle, TRUE, &Rect);            // Set Window Size 
}  // SetWindow



// main(Width,Height,WidthBuffer,HeightBuffer) -- main
//
int main(int argc, char *argv[]) {     
    int width = 80;
    int height = 25;
    int wbuffer = width + 200;
    int hbuffer = height + 1000;

    if ( argc == 5 ){
        width = atoi(argv[1]);
        height = atoi(argv[2]);
        wbuffer = atoi(argv[3]);
        hbuffer = atoi(argv[4]);
    } else if ( argc > 1 ) {
        cout << "Usage: " << argv[0] << " [ width height bufferwidth bufferheight ]" << endl << endl;
        cout << "  Where" << endl;
        cout << "    width            console width" << endl;
        cout << "    height           console height" << endl;
        cout << "    bufferwidth      scroll buffer width" << endl;
        cout << "    bufferheight     scroll buffer height" << endl;
        return 4;
    }    

    SetWindow(width,height,wbuffer,hbuffer);
    return 0;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...