'How to Detect Multiple Monitors in a Batch File

I have recently started diving into writing Batch files and I have a question. I'm trying to create a file that checks to see if my secondary monitor is connected and than if it is switches the primary display to the secondary screen. (Yes I do know about the windows+P shortcut)...

So far I have figured out that "DisplaySwitch.exe /external" sets the default display to the secondary monitor but I cannot find out how to detect whether the display is there first.

-Cheers, Luke



Solution 1:[1]

With Windows 10, may be just a call to:

 wmic desktopmonitor get DeviceID     

output:

DeviceID
DesktopMonitor1
DesktopMonitor2

More details about monitor with :

 wmic desktopmonitor get 

Solution 2:[2]

One possible way is to use dxdiag though it is not the fastest way:

@echo off

del ~.txt /q /f >nul 2>nul
dxdiag /t ~
w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:3  >nul 2>&1
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

this will print the resolutions of all monitors.

Update:

dxdiag prints info about all monitors so you can check if there are more than one monitors:

@echo off
del ~.txt /q /f >nul 2>nul
start "" /w dxdiag /t ~

for /f "tokens=1* delims=:" %%a in ('find /c "Current Mode:" "~.txt"') do (
    set /a "number_of_monitors=%%b"
    rem echo #%%b#
)
rem exit /b 0
echo %number_of_monitors%


rem :---- if it needed -----:

if defined number_of_monitors ( if %number_of_monitors% GTR 1 ( echo second monitor connected ) else (echo only one monitor connected ))
del ~.txt /q /f >nul 2>nul

Solution 3:[3]

@npocmaka's answer didn't quite work for me, but this variation of his code did (Windows 10):

rem @echo off
del %TEMP%\dxdiag.txt /q /f >nul 2>nul
start "" /w dxdiag -64bit -t %TEMP%\dxdiag.txt

for /f "tokens=3" %%f in ('find /c"Monitor Name:" %TEMP%\dxdiag.txt') do set MONITOR_COUNT=%%f

if defined MONITOR_COUNT ( if %MONITOR_COUNT% GTR 1 ( echo second monitor connected ) else (echo only one monitor connected ))
del %TEMP%\monitors.txt /q /f >nul 2>nul

Solution 4:[4]

By calling a powershell from the cmd the following will get the number of monitors:

powershell -Command "exit (Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorBasicDisplayParams | Select-String -Pattern 'InstanceName').length"
set nMons=%ERRORLEVEL%

Solution 5:[5]

SET monitors=monitors.txt
SET nMons=0
MultiMonitorTool.exe /scomma "%monitors%"
FOR /F "skip=1 tokens=9 delims=," %%a IN (%monitors%) DO IF %%a GTR 0 SET /A nMons += 1
echo Number of monitors: %nMons%

MultiMonitorTool

Solution 6:[6]

Here is quick way to get connected monitors count via powershell

$m = Get-PnpDevice -Class Monitor -Status OK | measure; $m.Count

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Pierre Jean
Solution 2
Solution 3 bcampolo
Solution 4 Skillmon
Solution 5 Michael Weiner
Solution 6 Arsen Sargsyan