web-dev-qa-db-fra.com

Comment modifier la taille du tampon d'écran dans l'invite de commande Windows à partir d'un script de traitement par lots

Je sais que vous pouvez faire un clic droit sur les propriétés -> disposition et le changer manuellement.

Mais comment feriez-vous pour le changer à partir d'un script batch Windows?

Je sais que vous pouvez en changer la taille à partir d'un script en utilisant quelque chose comme ceci

MODE CON: COLS=90 LINES=10

Mais comment changer la taille de la mémoire tampon?

Le script s'exécutera pendant un certain temps et parfois, avant d'échouer et de le quitter, cela prend un certain temps. J'ai donc besoin d'un tampon plus grand.

47
grobartn

Je cherchais simplement une réponse à cette question précise, venez découvrir que la commande elle-même ajuste le tampon!

mode con:cols=140 lines=70

La ligne = 70 ajuste réellement la hauteur dans le paramètre 'Screen Buffer Size', PAS la hauteur dans le paramètre 'Window Size'.

Facilement prouvé en exécutant la commande avec un paramètre pour 'lignes = 2500' (ou le tampon souhaité), puis en vérifiant les "Propriétés" de la fenêtre, vous verrez que le tampon est maintenant défini sur 2500.

Mon script de lot finit par ressembler à ceci:

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

Je voulais juste essayer un maximum de lignes sur Windows 7, je peux définir à l'aide de la commande mode con et je l'ai trouvé 32766 2 ^ 15-2 et vous pouvez le définir à l'aide de la commande suivante 

mode con lines=32766

bien que vous puissiez également définir la taille de la mémoire tampon de l'écran à partir de l'interface graphique, le maximum que vous pouvez obtenir est 9999.

40
Sankdyl
mode con lines=32766

définit la mémoire tampon, mais augmente également la hauteur de la fenêtre en plein écran, ce qui est moche.

Vous pouvez modifier les paramètres directement dans le registre:

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

Le prochain cmd.exe que vous démarrez a le tampon d’augmentation.

Donc, cela ne fonctionne pas pour le cmd.exe dans lequel vous êtes déjà, mais utilisez-le dans un fichier pre-batch.cmd qui appelle votre script principal.

11
Peter Hahndorf

Vous trouverez ci-dessous un programme VB.NET très simple qui fera ce que vous voulez.

Il définira la mémoire tampon sur une largeur de 100 caractères sur une hauteur de 1 000 caractères. Il définit ensuite la largeur de la fenêtre pour correspondre à la taille du tampon.

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

METTRE À JOUR

J'ai modifié le code pour d'abord définir Console.WindowWidth, puis Console.BufferWidth, car si vous essayez de définir Console.BufferWidth sur une valeur inférieure au Console.WindowWidth actuel, le programme lève une exception.

Il ne s'agit que d'un exemple ... vous devez ajouter du code pour gérer les paramètres de ligne de commande et la gestion des erreurs.

7
aphoria

Il existe une solution à CMD: Définissez la hauteur du tampon indépendamment de la hauteur de la fenêtre en utilisant efficacement une commande powershell exécutée à partir du script batch. Cette solution m'a permis de redimensionner le tampon de défilement dans la fenêtre de script batch existante indépendamment de la taille de la fenêtre, exactement ce que l'OP demandait.

Mise en garde: Il semble que le script oublie les variables (ou du moins l'a fait avec mon script), je vous recommande donc d'appeler la commande uniquement au début et/ou à la fin de votre script, ou sinon lorsque vous ne dépendez pas d'une session. variable locale.

5
rojo

Voici ce que j'ai fait au cas où quelqu'un le trouverait utile (j'ai utilisé beaucoup de choses en fonction du reste des réponses dans ce fil) :

J'ai d'abord ajusté les paramètres de mise en page selon les besoins. Cela modifie immédiatement la taille de la fenêtre, ce qui facilite la définition de la taille exacte souhaitée. Au fait, je ne savais pas que je pouvais aussi avoir une largeur visible inférieure à la largeur du tampon. C'était bien puisque je déteste habituellement une longue file à emballer. enter image description here

Ensuite, après avoir cliqué sur ok, j'ai ouvert regedit.exe et je suis allé à "HKEY_CURRENT_USER\Console". Il existe une nouvelle entrée enfant à cet emplacement "% SystemRoot% _system32_cmd.exe". J'ai cliqué dessus et sélectionné Export: enter image description here

J'ai enregistré ceci sous le nom "cmd_settings.reg". Ensuite, j'ai créé un script de traitement par lots qui importe ces paramètres, appelle le script de traitement par lots d'origine (nom batch_script.bat), puis supprime ce que j'ai importé pour que la fenêtre de ligne de commande puisse revenir aux paramètres par défaut:

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

Voici un exemple de lot pouvant être appelé ("batch_script.bat"):

@echo off
echo test!
pause
exit

N'oubliez pas la commande de sortie à la fin de votre script si vous souhaitez que la ligne de suppression du registre s'exécute après l'exécution du script.

3
xtsoler

Il n'y a pas d '"invite de commande DOS". DOS est mort complètement avec Windows ME ( 7/11/2006 ). C'est simplement appelé l'invite de commande sous Windows NT (NT, 2K, XP, Vista, 7).

Il n'y a aucun moyen de modifier le tampon d'écran à l'aide des commandes intégrées cmd.exe. Il peut être modifié via Console API Functions , afin de pouvoir créer un utilitaire pour le modifier. Je n'ai jamais essayé cela moi-même.

Une autre suggestion serait de rediriger la sortie vers un fichier et vers l’écran afin d’en obtenir une "copie papier". Windows n'a pas de commande TEE comme Unix, mais quelqu'un a résolu le problème .

2
Tergiver

Vous pouvez modifier la taille de la mémoire tampon de cmd en cliquant sur l'icône située dans le coin supérieur gauche -> Propriétés -> Mise en page -> Taille de la mémoire tampon de l'écran ..__
vous pouvez même le changer avec la commande cmd 

mode con:cols=100 lines=60
Jusqu'à lignes = 58 la hauteur de la fenêtre cmd change ..
Après la valeur des lignes de 58, la taille du tampon de la cmd change ...

1
Tejeshreddy

Si quelqu'un se pose encore la question, vous pouvez utiliser powershell sur les versions les plus récentes de Windows:

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

J'ai créé l'utilitaire suivant pour définir la taille de la console et les tampons de défilement.

Je l'ai compilé en utilisant DEV C++ ( http://www.bloodshed.net/devcpp.html ). 

Un exécutable est inclus dans 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

Je développe un commentaire que j'ai posté ici car la plupart des gens ne le remarqueront pas.

https://lifeboat.com/programs/console.exe est une version compilée du programme Visual Basic décrit à l'adresse https://stackoverflow.com/a/4694566/1752929 . Ma version définit simplement la hauteur de tampon à 32766, qui est la hauteur de tampon maximale disponible. Cela ne règle rien d'autre. Si la demande est forte, je pourrais créer un programme plus flexible, mais vous pouvez généralement définir d’autres variables dans l’onglet Disposition des raccourcis.

Voici la cible que j’utilise dans mon raccourci où je souhaite commencer dans le répertoire f. (Je dois définir le répertoire de cette façon, car Windows ne vous laissera pas le définir autrement si vous souhaitez exécuter la commande Invite en tant qu'administrateur.)

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

J'ai trouvé un moyen de redimensionner la taille du tampon sans influencer la taille de la fenêtre. Cela fonctionne grâce à une faille dans le fonctionnement du traitement par lots, mais le travail est fait.

mode 648 78 >nul 2>nul

Comment ça marche? Il y a une erreur de syntaxe dans cette commande, ce devrait être "mode 648, 78". En raison du fonctionnement du traitement par lots, la taille du tampon sera d'abord redimensionnée à 648, puis le redimensionnement de la fenêtre interviendra, mais il ne se terminera jamais à cause de l'erreur de syntaxe. Voilà, la taille de la mémoire tampon est ajustée et la taille de la fenêtre reste la même. Cela produit une erreur laide. Pour vous en débarrasser, ajoutez simplement "> nul 2> nul" et vous avez terminé.

0
Myzreal