it-swarm.com.ru

Как изменить размер экранного буфера в командной строке Windows из пакетного скрипта

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

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

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

MODE CON: COLS=90 LINES=10

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

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

47
grobartn

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

mode con:cols=140 lines=70

lines = 70 part фактически регулирует высоту в настройке «Screen Buffer Size», а НЕ в настройке «Window Size».

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

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

 @ echo off 
 cmd "mode con: cols = 140 lines = 2500" 
55
Namuna

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

mode con lines=32766

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

40
Sankdyl
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, который затем вызывает ваш основной скрипт.

11
Peter Hahndorf

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

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

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

Обновление

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

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

7
aphoria

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

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

5
rojo

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

Сначала я настроил параметры макета по мере необходимости. Это сразу меняет размер окна, чтобы было проще установить нужный размер. Кстати, я не знал, что у меня также может быть видимая ширина меньше, чем ширина буфера. Это было хорошо, так как я обычно ненавижу длинную очередь, чтобы быть завернутым. 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 запускалась после выполнения скрипта.

3
xtsoler

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

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

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

2
Tergiver

Вы можете изменить размер буфера cmd, щелкнув значок в верхнем левом углу -> свойства -> макет -> размер экрана буфера .
Вы даже можете изменить его с помощью команды cmd 

mode con:cols=100 lines=60
Upto lines = 58 высота окна cmd меняется ..
После значения строки 58 размер буфера cmd меняется ...

1
Tejeshreddy

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

powershell.exe -command "& {$pshost = Get-Host;$pswindow = $pshost.UI.RawUI;$newsize = $pswindow.BufferSize;$newsize.height = 150;$pswindow.buffersize = $newsize;}"
1
Arrow Pulford

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

Я скомпилировал его с помощью 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;
} 
1
CWa

Я расширяю комментарий, который я разместил здесь, так как большинство людей не заметят этот комментарий.

https://lifeboat.com/programs/console.exe - это скомпилированная версия программы Visual Basic, описанная в https://stackoverflow.com/a/4694566/1752929 . Моя версия просто устанавливает высоту буфера 32766, что является максимальной доступной высотой буфера. Больше ничего не настраивает. Если есть большой спрос, я мог бы создать более гибкую программу, но обычно вы можете просто установить другие переменные на вкладке быстрого доступа.

Ниже приводится цель, которую я использую в своем ярлыке, с которого я хочу начать в каталоге f. (Я должен установить каталог таким образом, поскольку Windows не позволит вам установить его каким-либо другим способом, если вы захотите запустить команду Prompt от имени администратора.)

C:\Windows\System32\cmd.exe /k "console & cd /d c:\f"
0
Eric Klien

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

mode 648 78 >nul 2>nul

Как это работает? В этой команде есть синтаксическая ошибка, это должен быть «режим 648, 78». Из-за того, как работает пакет, размер буфера сначала будет изменен до 648, а затем появится окно изменения размера, но оно никогда не завершится из-за синтаксической ошибки. Вуаля, размер буфера регулируется, а размер окна остается прежним. Это приводит к ужасной ошибке, поэтому, чтобы избавиться от нее, просто добавьте "> nul 2> nul", и все готово.

0
Myzreal