Выполните команду script в зависимости от разрешения экрана

3 Arnaud [2018-04-13 18:42:00]

Я попытался найти ответ на некоторые другие темы, но я думаю, что то, что я пытаюсь сделать, немного "специфично". Я не достаточно хорош с партией для адаптации/конкатенации частей скриптов, которые я нашел также...

Итак, я пытаюсь выполнить команду, в зависимости от разрешения экрана. Контекст следующий:

Команда, выполняемая при входе в систему, размещает ярлыки на рабочем столе специально, но это не то же расположение между разрешениями...

Идея состоит в том, чтобы определить переменную, которая является ответом на запрос wmic desktopmonitor получить экранный экран, экранную ширину. Затем, если вывод содержит 1080, выполните этот cmd, иначе, если он содержит 720, выполните другой и т.д.

thats cmd я использую для win7 (рабочий);

for /f "tokens=1-2 delims= " %%r in ('wmic desktopmonitor get screenheight^,  screenwidth ^| findstr "1"') do set current_res=%%sx%%r
if "%current_res%" == "1920x1080" C:\Windows\kiosque\desktopok.exe /load /silent c:\windows\kiosque\dispo_icones_1080p.dok

Мне нужно сделать то же самое с win10 с wmic path Win32_VideoController получить VideoModeDescription, но я не нашел, как правильно определить вывод этого запроса как переменной...

Заранее благодарим за помощь Arnaud

screen resolution batch-file request execute


2 ответа


1 Решение npocmaka [2018-04-13 19:18:00]

Вам нужны разные wmic-запросы, зависящие от версии windows. Здесь есть разрешение, которое зависит от версии:

@echo off
::https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions
setlocal
for /f "tokens=4,5 delims=. " %%a in ('ver') do set "version=%%a%%b"


if version lss 62 (
    ::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%
::if "%x%x%y%" == "1920x1080" C:\Windows\kiosque\desktopok.exe /load /silent c:\windows\kiosque\dispo_icones_1080p.dok

endlocal

Для окон 7 или более ранних версий вам нужен desktopmonitor класс для более новых версий Windows, которые вам нужны Win32_VideoController. Вы можете попробовать с dxdiag тоже:

@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

2 Compo [2018-04-13 19:13:00]

Поскольку Win32_VideoController был протестирован как работающий в моих системах Windows 7 и Windows 10, вот несколько примеров Win32_VideoController:

Извлечение горизонтального разрешения, как указано в вашем вопросе, как определяющий фактор:

For /F "Delims=" %%A In (
    'WMIC Path Win32_VideoController Get CurrentHorizontalResolution'
) Do For %%B In (%%A) Do Set "ResW=%%B"

Аналогично, если вы хотите проверить только вертикальное разрешение:

For /F "Delims=" %%A In (
    'WMIC Path Win32_VideoController Get CurrentVerticalResolution'
) Do For %%B In (%%A) Do Set "ResH=%%B"

И если вы хотите разрешение в формате WxH:

@Echo Off
Set "WP=Path Win32_VideoController"
Set "WV=CurrentHorizontalResolution,CurrentVerticalResolution"

For /F "Skip=1 Tokens=*" %%A In ('"WMIC %WP% Get %WV%"'
) Do For /F "Tokens=1-2" %%B In ("%%A") Do Set ScRes=%%Bx%%C
Echo=%ScRes%
Pause

Если вы хотите версию, которая учитывает как DesktopMonitor, так и Win32_VideoController, то, возможно, это будет сделано (начиная с Vista):

@Echo Off
Set "OV="
For /F "EOL=V" %%A In ('WMIc OS Get Version 2^>Nul'
) Do For /F "Tokens=1-2 Delims=." %%B In ("%%A") Do Set /A "OV=%%B%%C"
If Not Defined OV Exit /B
Set "ScRes=%%Cx%%B" & Set "WP=DesktopMonitor"
Set "WV=ScreenHeight,ScreenWidth"
If %OV% GEq 61 (Set "WP=Path Win32_VideoController" & Set "ScRes=%%Bx%%C"
    Set "WV=CurrentHorizontalResolution,CurrentVerticalResolution")
For /F "Skip=1 Tokens=*" %%A In ('"WMIC %WP% Get %WV%"'
) Do For /F "Tokens=1-2" %%B In ("%%A") Do Set ScRes=%ScRes%
Echo=%ScRes%
Pause

Я оставил строку 8 как GEq 61 для версий, по крайней мере, для Windows 7, потому что, как я уже сказал, она работает на моей версии для Windows 7.
Однако вы можете изменить это, чтобы читать Gtr 61 для Windows 8/Server 2012 и выше, или даже Gtr 63, если вы хотите ограничить его чем-либо выше Windows 8.1/Server 2012 R2