it-swarm.com.de

So ändern Sie die Bildschirmpuffergröße in der Windows-Eingabeaufforderung über das Batch-Skript

Ich weiß, dass Sie Eigenschaften -> Layout rechtsklicken und dort manuell ändern können.

Aber wie würden Sie es ändern, wenn Sie ein Windows-Stapelverarbeitungsskript ändern?

Ich weiß, dass Sie die Größe des Skripts mithilfe von etwas ändern können

MODE CON: COLS=90 LINES=10

Aber wie können Sie die Puffergröße ändern?

Das Skript läuft eine Weile und manchmal dauert es einige Zeit, bevor es fehlschlägt und beendet wird.

47
grobartn

Ich war gerade auf der Suche nach einer Antwort auf diese genaue Frage, um herauszufinden, ob der Befehl selbst den Puffer einstellt!

mode con:cols=140 lines=70

Mit dem lines = 70 Part wird die Höhe in der Einstellung 'Screen Buffer Size' angepasst, NICHT die Höhe in der Einstellung 'Window Size'.

Sie können dies leicht beweisen, indem Sie den Befehl mit einer Einstellung für 'lines = 2500' (oder dem gewünschten Puffer) ausführen und dann die 'Eigenschaften' des Fensters überprüfen. Sie werden feststellen, dass der Puffer jetzt auf 2500 gesetzt ist.

Mein Batch-Skript sieht dann so aus:

 @ echo off 
 cmd "Modus con: cols = 140 Zeilen = 2500" 
55
Namuna

Ich gab gerade einen Versuch für die maximale Anzahl von Zeilen unter Windows 7, die ich mit dem Befehl mode con einstellen kann, und stellte fest, dass er 32766 2 ^ 15-2 ist, und Sie können ihn mit folgendem Befehl einstellen 

mode con lines=32766

sie können zwar auch die Bildschirmpuffergröße über die GUI einstellen, aber die maximale Anzahl beträgt 9999.

40
Sankdyl
mode con lines=32766

setzt den Puffer, vergrößert aber auch die Fensterhöhe auf Vollbild, was unschön ist.

Sie können die Einstellungen direkt in der Registrierung ändern:

:: 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

Die nächste cmd.exe, die Sie starten, enthält den Puffer für die Erhöhung.

Das funktioniert also nicht für die cmd.exe, in der Sie sich bereits befinden, aber verwenden Sie dies einfach in einer pre-batch.cmd, die dann Ihr Hauptskript aufruft.

11
Peter Hahndorf

Nachfolgend finden Sie ein sehr einfaches VB.NET-Programm, das das tut, was Sie möchten.

Der Puffer wird auf 100 Zeichen breit und 1000 Zeichen hoch eingestellt. Dann wird die Breite des Fensters an die Puffergröße angepasst.

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

AKTUALISIEREN

Ich habe den Code so geändert, dass zunächst Console.WindowWidth und dann Console.BufferWidth festgelegt wurde. Wenn Sie versuchen, Console.BufferWidth auf einen Wert zu setzen, der unter dem aktuellen Console.WindowWidth liegt, wird eine Ausnahme ausgelöst.

Dies ist nur ein Beispiel ... Sie sollten Code hinzufügen, um Befehlszeilenparameter und Fehlerbehandlung zu behandeln.

7
aphoria

Bei CMD gibt es eine Lösung: Setzen Sie die Pufferhöhe unabhängig von der Fensterhöhe. Verwenden Sie effektiv einen Powershell-Befehl, der vom Batch-Skript ausgeführt wird. Mit dieser Lösung konnte ich die Größe des Scrollback-Puffers im vorhandenen Batch-Skript-Fenster unabhängig von der Fenstergröße ändern, genau so, wie es das OP verlangt.

Vorsichtsmaßnahme: Es scheint, dass das Skript die Variablen vergessen lässt (oder zumindest mit meinem Skript). Ich empfehle, den Befehl nur am Anfang und/oder Ende des Skripts aufzurufen oder wo Sie nicht von einer Sitzung abhängen lokale Variable.

5
rojo

Hier ist, was ich getan habe, falls jemand es nützlich findet (Ich habe entsprechend den übrigen Antworten in diesem Thread viele Dinge verwendet) :

Zuerst habe ich die Layouteinstellungen nach Bedarf angepasst. Dadurch wird die Fenstergröße sofort geändert, sodass Sie die gewünschte Größe leichter einstellen können. Übrigens wusste ich nicht, dass ich auch eine sichtbare Breite haben kann, die kleiner als der Breitenpuffer ist. Das war schön, da ich normalerweise keine langen Schlingen hassen muss. enter image description here

Nachdem ich auf OK geklickt hatte, öffnete ich regedit.exe und ging zu "HKEY_CURRENT_USER\Console". Dort ist ein neuer untergeordneter Eintrag "% SystemRoot% _system32_cmd.exe". Ich habe mit der rechten Maustaste darauf geklickt und Export ausgewählt: enter image description here

Ich habe dies als "cmd_settings.reg" gespeichert. Dann habe ich ein Stapelskript erstellt, das diese Einstellungen importiert, mein ursprüngliches Stapelskript (Name batch_script.bat) aufruft und das, was ich importiert habe, löscht, damit das Befehlszeilenfenster auf die Standardeinstellungen zurückgesetzt wird:

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

Dies ist ein Beispielstapel, der aufgerufen werden konnte ("batch_script.bat"):

@echo off
echo test!
pause
exit

Vergiss den exit-Befehl am Ende deines Skripts nicht, wenn die reg delete-Zeile nach der Skriptausführung ausgeführt werden soll.

3
xtsoler

Es gibt keine "DOS-Eingabeaufforderung". DOS ist vollständig mit Windows ME gestorben ( 7/11/2006 ). Es wird einfach als Eingabeaufforderung unter Windows NT (NT, 2K, XP, Vista, 7) bezeichnet.

Es ist nicht möglich, den Bildschirmpuffer über die integrierten cmd.exe-Befehle zu ändern. Es kann über Console API Functions geändert werden, sodass Sie möglicherweise ein Dienstprogramm erstellen können, um es zu ändern. Ich habe das selbst nie probiert.

Ein anderer Vorschlag wäre, die Ausgabe sowohl in eine Datei als auch auf den Bildschirm umzuleiten, damit Sie eine "Kopie" davon haben. Windows hat keinen TEE-Befehl wie Unix, aber jemand hat das behoben.

2
Tergiver

Sie können die Puffergröße von cmd ändern, indem Sie auf das Symbol in der oberen linken Ecke -> Eigenschaften -> Layout -> Bildschirmpuffergröße ..__ klicken.
Sie können es sogar mit dem Befehl cmd ändern 

mode con:cols=100 lines=60
Bis Zeilen = 58 Die Höhe des Cmd-Fensters ändert sich ..
Nach Zeilenwert 58 ändert sich die Puffergröße des cmd ...

1
Tejeshreddy

Wenn sich noch jemand wundert, können Sie bei den neueren Versionen von Windows Powershell verwenden:

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

Ich habe das folgende Dienstprogramm erstellt, um die Konsolengröße und die Bildlaufpuffer einzustellen.

Ich habe es mit DEV C++ kompiliert ( http://www.bloodshed.net/devcpp.html ). 

Eine ausführbare Datei ist in https://sourceforge.net/projects/wa2l-wintools/ enthalten.

#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

Ich erweitere einen Kommentar, den ich hier gepostet habe, da die meisten Leute den Kommentar nicht bemerken werden.

https://lifeboat.com/programs/console.exe ist eine kompilierte Version des Visual Basic-Programms, das unter https://stackoverflow.com/a/4694566/1752929 beschrieben ist. In meiner Version wird die Pufferhöhe einfach auf 32766 festgelegt. Dies ist die maximal verfügbare Pufferhöhe. Es passt nichts anderes an. Wenn es eine große Nachfrage gibt, könnte ich ein flexibleres Programm erstellen. Im Allgemeinen können Sie jedoch einfach weitere Variablen in Ihrem Shortcut-Layout-Register festlegen.

Folgendes ist das Ziel, das ich in meiner Verknüpfung verwende, wo ich im f-Verzeichnis beginnen möchte. (Ich muss das Verzeichnis so einstellen, da Windows es Ihnen nicht erlaubt, es anders einzustellen, wenn Sie den Befehl Eingabeaufforderung als Administrator ausführen möchten.)

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

Ich habe einen Weg gefunden, die Größe des Puffers zu ändern, ohne die Fenstergröße zu beeinflussen. Es funktioniert dank eines Fehlers in der Stapelverarbeitung, aber es erledigt die Arbeit.

mode 648 78 >nul 2>nul

Wie funktioniert es? Dieser Befehl enthält einen Syntaxfehler. Er sollte "Modus 648, 78" sein. Aufgrund der Funktionsweise von Batch wird zunächst die Größe des Puffers auf 648 geändert. Anschließend wird die Fenstergröße geändert. Aufgrund des Syntaxfehlers wird sie jedoch nie beendet. Voila, die Puffergröße wird angepasst und die Fenstergröße bleibt gleich. Dies führt zu einem hässlichen Fehler. Fügen Sie einfach "> nul 2> nul" hinzu und fertig.

0
Myzreal