Obtenga resolución de pantalla desde la línea de comandos de Windows

19

He visto varias sugerencias sobre programas para cambiar la resolución desde la línea de comandos. Sin embargo, solo quiero mostrarlo, no cambiarlo.

En Linux puedo usar xrandro xdpyinfopara obtener esta información, así que estoy buscando algo así.

También lo necesito para trabajar dentro de un shell cygwin.

Zitrax
fuente
2
Nota: También hay una versión de PowerShell disponible si alguien está interesado. Más en stackoverflow también resuelven el problema con varios monitores
nixda

Respuestas:

20

Prueba esto:

wmic desktopmonitor get screenheight, screenwidth

Desde dentro de Cygwin:

cmd /c wmic desktopmonitor get screenheight, screenwidth

No estoy seguro de qué trucos usar para usar la salida. Tal vez un archivo de texto temporal?

paradroid
fuente
Sí, gracias, funciona desde cmd.exe. Sin embargo, olvidé mencionar que necesito que esto funcione dentro de un shell cygwin y wmic no parece funcionar allí.
Zitrax
1
@ Zitrax: Ahora dime.
paradroid
Gracias de nuevo. Sin embargo, no funcionó cuando se conectó con rdesktop (o ssh en cygwin). Sería genial tenerlo en todas esas situaciones también.
Zitrax
2
No funciona en Win8.1 o win10. Da resultados vacíos tanto para la altura de pantalla como para el ancho de pantalla.
David Balažic
1
@paradroid No funciona, como se explica en la otra respuesta
David Balažic
10

Con dxdiag, aunque no es la forma más rápida:

@echo off

del ~.txt /q /f >nul 2>nul
start "" /w dxdiag /t ~
setlocal enableDelayedExpansion
set currmon=1 
for /f "tokens=2 delims=:" %%a in ('find "Current Mode:" ~.txt') do (
    echo Monitor !currmon! : %%a
    set /a currmon=currmon+1

)
endlocal
del ~.txt /q /f >nul 2>nul

Esto imprimirá las resoluciones de todos los monitores.

Editar . La respuesta aceptada usa WMIC. ( wmic desktopmonitor get screenheight, screenwidth /format:value). Esto no funcionará en windows8 / 8.1 / 10. Para las versiones más nuevas de Windows esto se puede usar:

wmic path Win32_VideoController get VideoModeDescription,CurrentVerticalResolution,CurrentHorizontalResolution /format:value

Un script que verifica la versión de Windows y luego obtiene la resolución con el wmic:

@echo off

setlocal
for /f "tokens=4,5 delims=. " %%a in ('ver') do set "version=%%a%%b"


if version lss 62 (
    ::set "wmic_query=wmic desktopmonitor get screenheight, screenwidth /format:value"
    for /f "tokens=* delims=" %%@ in ('wmic desktopmonitor get screenwidth /format:value') do (
        for /f "tokens=2 delims==" %%# in ("%%@") do set "x=%%#"
    )
    for /f "tokens=* delims=" %%@ in ('wmic desktopmonitor get screenheight /format:value') do (
        for /f "tokens=2 delims==" %%# in ("%%@") do set "y=%%#"
    )

) else (
    ::wmic path Win32_VideoController get VideoModeDescription,CurrentVerticalResolution,CurrentHorizontalResolution /format:value
    for /f "tokens=* delims=" %%@ in ('wmic path Win32_VideoController get CurrentHorizontalResolution  /format:value') do (
        for /f "tokens=2 delims==" %%# in ("%%@") do set "x=%%#"
    )
    for /f "tokens=* delims=" %%@ in ('wmic path Win32_VideoController get CurrentVerticalResolution /format:value') do (
        for /f "tokens=2 delims==" %%# in ("%%@") do set "y=%%#"
    )

)

echo Resolution %x%x%y%

endlocal
npocmaka
fuente
2

Gracias @paradroid :) Con WMIC, escribí Batch Script en Escritorio remoto no en pantalla completa pero aún así conveniente. ^ _ ^

@echo off
:p00
setlocal
if "%1"=="" goto :q01
set i01=wmic desktopmonitor
set i01=%i01% where availability^=3
set i01=%i01% get screenHeight,screenWidth
set o01=%temp%\ScrRes.txt
%i01%>"%o01%"
for /f "delims= skip=1" %%o in ('type %o01%') do call :p01 %1 %%o
goto :p99

:p01
set srvnm=%1
set /a tl=%2-40
set /a ll=%3-80
start mstsc /admin /w:%ll% /h:%tl% /v:%srvnm%
goto :eof

:q01
echo.
echo ^>^> Syntax: %0 MachineHostname [enter]
echo.

:p99
if exist "%o01%" del "%o01%" /f /q
echo.
echo ^>^> Sincerely Thank You For Using..
endlocal
goto :eof

Siéntase libre de explorar. Siéntete entusiasta para mejorar. (y)

Rhak Kahr
fuente
1

use MultiMonitorTool :

MultiMonitorTool.exe /scomma "%TEMP%\MultiMonitorTool.csv"

luego analice el archivo "% TEMP% \ MultiMonitorTool.csv" (todavía estoy trabajando en esto)

Eadmaster
fuente
1

la vieja respuesta ya no parece funcionar (win7 64bit); lo resolví de esa manera

FOR /f "tokens=1,2" %%a IN ('"wmic desktopmonitor get screenheight, screenwidth"') DO (
    SET /a ScreenHeight=%%a
    SET /a ScreenWidth=%%b
)
echo %ScreenHeight%
echo %ScreenWidth%
Lesto
fuente
1

Para la configuración de varios monitores, simplemente divida el comando:

setlocal ENABLEDELAYEDEXPANSION
setlocal ENABLEEXTENSIONS
set wmicheight="wmic desktopmonitor get screenheight /format:value"
set wmicwidth="wmic desktopmonitor get screenwidth /format:value"
:height
for /f "tokens=2 delims==" %%a in ('%wmicheight%') do (
    If %%a LEQ 1 (
        rem skip if height is not bigger than 1
    ) Else (
        rem take the first height value larger than 1
        rem then skip to width
        Set /a "height=%%a"
        goto :width
    )
)
:width
for /f "tokens=2 delims==" %%a in ('%wmicwidth%') do (
    If %%a LEQ 1 (
        rem skip if width is not bigger than 1
    ) Else (
        rem add width found to get total width of all screens
        Set /a "width=width+%%a"
    )
)
echo %width% x %height%
Rob Moore
fuente
Por favor use bloques de código. Has sido miembro aquí el tiempo suficiente para saber cómo funciona el descuento y cómo hacer que se vea legible.
Karan
1

La forma más simple:

@echo off
::By SachaDee 2018

FOR /F "skip=2 delims=" %%a IN ('wmic path Win32_VideoController get VideoModeDescription^,CurrentHorizontalResolution^,CurrentVerticalResolution /format:Value ^| findstr ":"') do set %%a

echo Width =^> %CurrentHorizontalResolution%
echo Height =^> %CurrentVerticalResolution%
echo Description =^> %VideoModeDescription%
SachaDee
fuente
¿Puedes dar un poco más de explicación sobre lo que está pasando aquí? Entiendo que /format:Valuedevuelve resultados en una forma var = value que luego se usa en el setcomando. Si solo desea un valor, ¿hay alguna manera de hacerlo sin el ciclo for?
Kyle Delaney
Si solo desea mostrar el valor necesario, puede ejecutar una wmicconsulta solo con los parámetros correctos para mostrar el valor. El forbucle se usa aquí para setlos valores para un uso posterior en el código. Esa es la única forma de hacerlo batutilizando un comando externo ( wmic.exeen este caso).
SachaDee
¿No se puede usar setcon un wmicresultado sin un ciclo for?
Kyle Delaney
No, no es posible !
SachaDee
0

Este es mi intento:

@echo off
Mode 45,3 & color 0A
Title Dislpay Resolution by Hackoo 2018
Set "WMIC_Command=wmic path Win32_VideoController get VideoModeDescription^,CurrentHorizontalResolution^,CurrentVerticalResolution /format:Value"
Set "H=CurrentHorizontalResolution"
Set "V=CurrentVerticalResolution"
Call :GetResolution %H% HorizontalResolution
Call :GetResolution %V% VerticalResolution
echo(
echo     Screen Resolution is : %HorizontalResolution% x %VerticalResolution%
pause>nul & Exit
::****************************************************
:GetResolution 
FOR /F "tokens=2 delims==" %%I IN (
  '%WMIC_Command% ^| find /I "%~1" 2^>^nul'
) DO FOR /F "delims=" %%A IN ("%%I") DO SET "%2=%%A"
Exit /b
::****************************************************
Hackoo
fuente