Obter resolução de exibição da linha de comando do Windows

19

Eu vi várias sugestões sobre programas para alterar a resolução da linha de comando. No entanto, eu só quero exibi-lo, não alterá-lo.

No linux eu posso usar xrandrou xdpyinfoobter essa informação, então estou procurando por algo assim.

Eu também preciso que ele funcione dentro de um shell cygwin.

Zitrax
fonte
2
Nota: Há também uma versão do PowerShell disponível se alguém estiver interessado. No StackOverflow eles também resolveram o problema do multimonitor
nixda

Respostas:

20

Tente isto:

wmic desktopmonitor get screenheight, screenwidth

De dentro do Cygwin:

cmd /c wmic desktopmonitor get screenheight, screenwidth

Não sei quais truques usar para usar a saída. Talvez um arquivo de texto temporário?

paradroid
fonte
Sim, obrigado, funciona a partir do cmd.exe. No entanto eu esqueci de mencionar que eu preciso disso para trabalhar dentro de um shell cygwin e wmic não parecem funcionar lá.
Zitrax
1
@Zitrax: Agora você me diz.
paradroid
Obrigado novamente. Ele não funcionou ao se conectar com o rdesktop (ou ssh no cygwin). Seria ótimo tê-lo em todas essas situações também.
Zitrax
2
Não funciona no Win8.1 ou no win10. Ele fornece resultados vazios para a largura de tela e largura de tela.
David Balažic
1
@paradroid Ele não funciona, como explicado na outra resposta
David Balažic
10

Com dxdiag embora não seja o caminho mais rápido:

@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

isso imprimirá as resoluções de todos os monitores.

Editar . A resposta aceita usa o WMIC. ( wmic desktopmonitor get screenheight, screenwidth /format:value). Isto não funcionará no windows8 / 8.1 / 10. Para as versões mais novas do Windows, isso pode ser usado:

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

Um script que verifica a versão do Windows e obtém a resolução com o 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
fonte
2

Obrigado @ paradroid :) Com WMIC, eu escrevi Batch Script para o Remote Desktop não em tela cheia, mas ainda 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

Sinta-se livre para explorar. Sinta-se entusiasmado para melhorar. (y)

Rhak Kahr
fonte
1

use o MultiMonitorTool :

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

em seguida, analise o arquivo "% TEMP% \ MultiMonitorTool.csv" (ainda estou trabalhando nisso)

eadmaster
fonte
1

a resposta oldes parece não funcionar mais (win7 64 bits); eu resolvi assim

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
fonte
1

Para a configuração de vários monitores, basta dividir o 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
fonte
Por favor, use blocos de código. Você é membro há tempo suficiente para saber como funciona o markdown e como torná-lo legível.
Karan
1

O caminho mais simples:

@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
fonte
Você pode dar uma pequena explicação sobre o que está acontecendo aqui? Eu entendo /format:Valueretorna resultados em um formulário var = valor que é então usado no setcomando. Se você quer apenas um valor, existe uma maneira de fazer isso sem o loop for?
Kyle Delaney
Se você quiser apenas exibir o valor necessário, pode executar apenas uma wmicconsulta com os parâmetros corretos para exibir apenas o valor. O forloop é usado aqui para setos valores para um uso posterior no código. Essa é a única maneira de fazer isso batusando um comando externo ( wmic.exeneste caso).
SachaDee
Você não pode usar setcom um wmicresultado sem um loop for?
Kyle Delaney
Não, não é possível!
SachaDee
0

Esta é minha tentativa:

@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
fonte