2013-02-20 21 views

Antwort

9

Ich mag den Ansatz mit dem integrierten mode Befehl in Windows. Versuchen Sie, die folgende Batch-Datei:

@echo off 
for /F "usebackq tokens=2* delims=: " %%W in (`mode con ^| findstr Columns`) do set CONSOLE_WIDTH=%%W 
echo Console is %CONSOLE_WIDTH% characters wide 

Beachten Sie, dass dies die Größe des Konsolenpuffer zurückzukehren, und nicht die Größe des Fensters (die scrollbaren ist). Wenn Sie die Höhe der Windows-Konsole festlegen möchten, können Sie Columns im Ausdruck findstr mit Lines ersetzen. Auch hier wird es um die Höhe des Puffers zurückkehrt, nicht das Fenster ... Ich persönlich mag einen großen Puffer zurück durch die Geschichte zu ermöglichen, habe Scrollen, für mich so in der Regel die Linien berichten über 3000 :)


Just for fun, hier ist eine Version, die nicht findstr nicht verwenden, um die Ausgabe zu filtern ... im Fall (aus irgendeinem Grund) Sie haben eine Abneigung gegen findstr:

@echo off 
for /F "usebackq tokens=1,2* delims=: " %%V in (`mode con`) do (
    if .%%V==.Columns (
     set CONSOLE_WIDTH=%%W 
     goto done 
    ) 
) 
:done 
echo Console is %CONSOLE_WIDTH% characters wide 

Hinweis wurde dies alles versucht, in Windows XP SP3, in einer Reihe von verschiedenen Fenstern (einschließlich eines ausführenden FAR-Managers).

+0

Dieser Ansatz stürzt ab, wenn das System eine andere Sprache als Englisch verwendet. Sehen Sie sich die Antwort von @ user2475020 an, wenn Sie Sprachunabhängigkeit wünschen. – SapuSeven

0

Sie können es nicht in einer Umgebungsvariablen abrufen, es wird jedoch in der Registrierung gespeichert, sodass Sie über Ihr Stapel-Skript darauf zugreifen können.

Es gibt Antworten hier, wie es zu ändern: How to change Screen buffer size in Windows Command Prompt from batch script

Auf ähnliche Art und Weise Sie reg.exe QUERY [key details] anstatt reg.exe ADD [details] verwenden können. Einzelheiten finden Sie unter Technet documentation für HKCU\Console.

+0

Wie funktioniert das mit mehreren Konsolen und mehreren Breiten? Wie kann ich wissen, welcher Schlüssel für meine aktuelle Konsole gilt (im Gegensatz zur Standardbreite für eine neue Konsole)? –

+0

Wenn ich zur Arbeit komme, verlinke ich auf den Technet-Artikel für 'hkcu \ console \ windowsize'. Außerdem weiß ich, dass es eine Powershell-ish-Methode gibt, um die aktuellen Fensterdimensionen und die Puffergröße einzustellen. Ich werde sehen, ob ich etwas Ähnliches finden kann, um die Dimensionen zu lesen anstatt zu setzen. – rojo

+0

@rojo: Es gibt bereits eine Antwort von Ihnen auf die Frage, die ich mit einer Powershell-Methode verknüpft habe. – Vicky

2

Die Powershell-Eigenschaft (Get-Host).UI.RawUI.WindowSize legt die Dimensionen des aktuellen Konsolenfensters fest oder gibt sie zurück. Sie können es erfassen mit einer for Schleife thusly:

for /f %%I in ('powershell ^(Get-Host^).UI.RawUI.WindowSize.width') do set width=%%I 
+0

Dies geht davon aus, dass Powershell installiert ist, was für XP-Benutzer möglicherweise nicht der Fall ist. –

+0

+1, Der Powershell-Befehl kann so einfach wie 'Powershell (get-Host) .ui.rawui sein.windowsize.width'. Hintergrundinformationen finden Sie unter http://blogs.technet.com/b/heyscriptingguy/archive/2006/12/04/how-can-i-expand-the-width-of-the-windows-powershell-console.aspx – dbenham

+0

@AxelFontaine - Ich glaube nicht, dass es eine reine Batch-Lösung gibt. Die Informationen werden über .NET bereitgestellt, und soweit ich weiß, ist Powershell die einzige native Skriptsprache, die auf .NET zugreifen kann. Leider haben Sie Recht, Powershell ist möglicherweise nicht auf einem XP-Computer verfügbar. – dbenham

0

Okay, hier ist eine, die nicht von Powershell erfordert installiert werden. Es erstellt, führt und löscht eine .NET-Anwendung, um eine Batch-Skriptvariable festzulegen. :)

@echo off 
setlocal 
pushd "%windir%\microsoft.net\" 
for /f "delims=" %%I in ('dir /s /b csc.exe') do (
    set csc=%%I 
    goto next 
) 
:next 
popd 
echo using System;>width.cs 
echo class Width {>>width.cs 
echo public static void Main() {>>width.cs 
echo string m1 = "{0}";>>width.cs 
echo Console.WriteLine^(m1, Console.WindowWidth^); } }>>width.cs 
"%csc%" /out:width.exe width.cs >NUL 2>NUL 
for /f %%I in ('width.exe') do set width=%%I 
del width.exe width.cs 
echo %width% 
+0

Diese Antwort hängt davon ab, .NET installiert zu haben, und überprüft nicht, ob 'csc.exe' nicht existiert. Das stimme ich der extremen Codierung zu! Gut gemacht. – icabod

+0

Das funktioniert ... aber es ist ein wenig verwirrend, weil Sie '.vb' für die Quelldateierweiterung verwendet haben, aber Ihr Code ist eigentlich C#. – aphoria

+0

Ya, ich fing an, es in vb zu schreiben, aber wechselte zu C#. Ich hatte keine Lust, die Dateierweiterungen zu bearbeiten, aber ich werde es tun, seit jemand es bemerkt hat. :) – rojo

2

versuchen, diese (Sprache/locale/.net unabhängig):

@ECHO OFF 
SET "ConsoleWidth=" 
SET /A LINECOUNT=0 
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /F "tokens=1,2,*" %%A IN ('mode con') DO (SET /A LINECOUNT=!LINECOUNT!+1&IF !LINECOUNT! EQU 4 SET ConsoleWidth=%%B) 
SETLOCAL DISABLEDELAYEDEXPANSION 
SET "LINECOUNT=" 
ECHO ConsoleWidth: %ConsoleWidth% characters 

getestet auf Windows XP und Windows 7, sowohl in der tschechischen Sprache