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

<p>я знаю, что вы можете сделать правой кнопкой мыши свойства -> макет и там изменить его вручную.</p><p>но как бы вы изменили его из пакетного скрипта windows?</p><p>я знаю, что вы можете изменить его размер из скрипта, используя что-то вроде этого</p><p><code>mode con: cols=90 lines=10</code></p><p>но как вы можете изменить размер буфера?</p><p>скрипт будет работать некоторое время, а иногда, прежде чем произойдет сбой, и выход из него займет некоторое время, поэтому мне нужен больший буфер.</p>

<p>я просто искал ответ на этот точный вопрос, пришел узнать, что команда сама настраивает буфер!</p><pre><code>mode con:cols=140 lines=70 </code></pre><p><strong> lines = 70 </strong>part фактически регулирует высоту в настройке «screen buffer size», а не в настройке «window size».</p><p>это легко проверить, выполнив команду с параметром 'lines = 2500' (или любым другим буфером, который вы хотите), а затем проверив 'properties' окна, и вы увидите, что действительно буфер теперь установлен на 2500.</p><p>мой пакетный скрипт выглядит так:</p><pre> @ echo off cmd "mode con: cols = 140 lines = 2500" </pre>

<p>я только что попробовал максимальное количество строк в windows 7, которое я могу установить с помощью команды <code>mode con</code>, и обнаружил, что оно равно 32766 2 ^ 15-2, и вы можете установить его с помощью следующей команды </p><pre><code>mode con lines=32766 </code></pre><p>хотя вы также можете установить размер экранного буфера из графического интерфейса, но максимум, который вы можете получить, составляет 9999.</p>

<pre><code>mode con lines=32766 </code></pre><p>устанавливает буфер, но также увеличивает высоту окна до полного экрана, что ужасно.</p><p>вы можете изменить настройки прямо в реестре:</p><pre><code>:: 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 </code></pre><p>следующий запущенный cmd.exe имеет буфер увеличения.</p><p>так что это не работает для cmd.exe, в котором вы уже находитесь, но просто используйте это в pre-batch.cmd, который затем вызывает ваш основной скрипт.</p>

<p>ниже приведена очень простая программа vb.net, которая будет делать то, что вы хотите.</p><p>это установит буфер в 100 символов в ширину и 1000 символов в высоту. затем он устанавливает ширину окна в соответствии с размером буфера.</p><pre><code>module consolebuffer sub main() console.windowwidth = 100 console.bufferwidth = 100 console.bufferheight = 1000 end sub end module </code></pre><h2>обновление</h2><p>я изменил код, чтобы сначала установить <code>console.windowwidth</code>, а затем установить <code>console.bufferwidth</code>, потому что если вы попытаетесь установить для <code>console.bufferwidth</code> значение меньше текущего <code>console.windowwidth</code>, программа выдаст исключение.</p><p>это только пример ... вы должны добавить код для обработки параметров командной строки и обработки ошибок.</p>

<p>в <a href="https://stackoverflow.com/questions/13311924/cmd-set-buffer-height-independently-of-window-height">cmd есть решение: установить высоту буфера независимо от высоты окна</a> , эффективно используя команду powershell, выполняемую из пакетного сценария. это решение позволило мне изменить размер буфера прокрутки в существующем окне пакетного сценария независимо от размера окна, в точности так, как запрашивал op.</p><p>предостережение. похоже, что сценарий забывает переменные (или, по крайней мере, так было с моим сценарием), поэтому я рекомендую вызывать команду только в начале и/или конце сценария, или в других случаях, когда вы не зависите от сеанса. локальная переменная.</p>

<p>вот что я сделал на тот случай, если кто-то найдет это полезным<em> (я использовал много вещей в соответствии с остальными ответами в этой теме) </em>:</p><p>сначала я настроил параметры макета по мере необходимости. это сразу меняет размер окна, чтобы было проще установить нужный размер.<em> кстати, я не знал, что у меня также может быть видимая ширина меньше, чем ширина буфера. это было хорошо, так как я обычно ненавижу длинную очередь, чтобы быть завернутым. </em> <img src="https://i.stack.imgur.com/xfecf.jpg" alt="enter image description here"></p><p>затем, после нажатия ок, я открыл regedit.exe и перешел в «hkey\_current\_user\console». там есть новая дочерняя запись "% systemroot% \_system32\_cmd.exe". я щелкнул правой кнопкой мыши на этом и выбрал экспорт: <img src="https://i.stack.imgur.com/lyyio.jpg" alt="enter image description here"></p><p>я сохранил это как "cmd\_settings.reg". затем я создал пакетный скрипт, который импортирует эти настройки, вызывает мой оригинальный пакетный скрипт (имя batch\_script.bat) и затем удаляет то, что я импортировал, чтобы окно командной строки вернулось к настройкам по умолчанию:</p><pre><code>regedit /s cmd\_settings.reg start /wait batch\_script.bat reg delete "hkey\_current\_user\console\%%systemroot%%\_system32\_cmd.exe" /f </code></pre><p>это образец пакета, который может быть вызван ("batch\_script.bat"):</p><pre><code>@echo off echo test! pause exit </code></pre><p><em> не забывайте команду выхода в конце вашего скрипта, если вы хотите, чтобы строка reg delete запускалась после выполнения скрипта. </em></p>

<p>нет "командной строки dos". dos полностью умер с windows me ( <a href="http://support.microsoft.com/lifecycle/?ln=en-us&p1=6519&x=17&y=12">7/11/2006</a> ). он просто называется командной строкой в windows nt (nt, 2k, xp, vista, 7).</p><p>нет способа изменить экранный буфер с помощью встроенных команд cmd.exe. его можно изменить через <a href="http://msdn.microsoft.com/en-us/library/ms682073.aspx">консольные функции api</a> , поэтому вы можете создать утилиту для его изменения. я никогда не пробовал это сам.</p><p>еще одно предложение - перенаправить вывод как в файл, так и на экран, чтобы у вас была его «бумажная копия». в windows нет команды tee, такой как unix, но <a href="http://www.chipstips.com/?p=129">кто-то исправил это</a> .</p>

<p>вы можете изменить размер буфера cmd, щелкнув значок в верхнем левом углу -> свойства -> макет -> размер экрана буфера . <br> вы даже можете изменить его с помощью команды cmd <br/> <br/><code>mode con:cols=100 lines=60</code> <br/> upto lines = 58 высота окна cmd меняется .. <br/> после значения строки 58 размер буфера cmd меняется ...</p>

<p>если кому-то все еще интересно, в новых версиях windows вы можете использовать powershell:</p><pre><code>powershell.exe -command "& {$pshost = get-host;$pswindow = $pshost.ui.rawui;$newsize = $pswindow.buffersize;$newsize.height = 150;$pswindow.buffersize = $newsize;}" </code></pre>

<p>я создал следующую утилиту для установки размера консоли и буферов прокрутки.</p><p>я скомпилировал его с помощью dev c++ ( <a href="http://www.bloodshed.net/devcpp.html">http://www.bloodshed.net/devcpp.html</a> ). </p><p>исполняемый файл включен в <a href="https://sourceforge.net/projects/wa2l-wintools/">https://sourceforge.net/projects/wa2l-wintools/</a> .</p><pre><code>#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; } </code></pre>

<p>я расширяю комментарий, который я разместил здесь, так как большинство людей не заметят этот комментарий.</p><p> <a href="https://lifeboat.com/programs/console.exe">https://lifeboat.com/programs/console.exe</a> - это скомпилированная версия программы visual basic, описанная в <a href="https://stackoverflow.com/a/4694566/1752929">https://stackoverflow.com/a/4694566/1752929</a> . моя версия просто устанавливает высоту буфера 32766, что является максимальной доступной высотой буфера. больше ничего не настраивает. если есть большой спрос, я мог бы создать более гибкую программу, но обычно вы можете просто установить другие переменные на вкладке быстрого доступа.</p><p>ниже приводится цель, которую я использую в своем ярлыке, с которого я хочу начать в каталоге f. (я должен установить каталог таким образом, поскольку windows не позволит вам установить его каким-либо другим способом, если вы захотите запустить команду prompt от имени администратора.)</p><pre><code>c:\windows\system32\cmd.exe /k "console & cd /d c:\f" </code></pre>

<p>я нашел способ изменить размер буфера, не влияя на размер окна. это работает благодаря недостатку в том, как работает партия, но это делает работу.</p><pre><code>mode 648 78 >nul 2>nul </code></pre><p>как это работает? в этой команде есть синтаксическая ошибка, это должен быть «режим 648, 78». из-за того, как работает пакет, размер буфера сначала будет изменен до 648, а затем появится окно изменения размера, но оно никогда не завершится из-за синтаксической ошибки. вуаля, размер буфера регулируется, а размер окна остается прежним. это приводит к ужасной ошибке, поэтому, чтобы избавиться от нее, просто добавьте "> nul 2> nul", и все готово.</p>