Программирование

Как переключить устройство в batch с pnputil: скрипты и примеры

Вопрос о том, как в batch‑скрипте проверить статус устройства pnputil и переключить его включённым/выключённым состоянием. Предоставлены 3 примера с комментариями.

Как написать bat‑скрипт, который проверяет состояние конкретного устройства и, если оно включено, отключает его, а если выключено – включает? Нужно использовать pnputil: pnputil /disable-device “ACPI\SYNA2BA6\3&C8C3232&0” и pnputil /enable-device “ACPI\SYNA2BA6\3&C8C3232&0”. Предоставьте несколько вариантов скриптов с комментариями, объясняющими работу условных операторов и циклов в batch.

Проверить и переключить состояние устройства в batch можно, читая вывод pnputil /enum-devices, определяя статус «Started» (включено) или «Disabled» (выключено), и вызывая pnputil /disable-device или pnputil /enable-device. Ниже три простых варианта с подробными комментариями.

Содержание

Вариант 1: простая проверка статуса и переключение

bat
@echo off
setlocal

:: Указываем точный ID устройства
set "DEVID=ACPI\\SYNA2BA6\\3&C8C3232&0"

:: Получаем статус устройства из списка всех устройств
for /f "tokens=1,2 delims=:" %%A in ('pnputil /enum-devices ^| findstr /i "%DEVID%"') do (
    set "STATUS=%%B"
)

:: Обрезаем пробелы и переводим статус в нижний регистр
set "STATUS=%STATUS: =%"
set "STATUS=%STATUS:~0,7%"

:: Если статус «Started» – выключаем, иначе включаем
if /i "%STATUS%"=="Started" (
    echo Устройство %DEVID% включено. Отключаем...
    pnputil /disable-device "%DEVID%"
) else (
    echo Устройство %DEVID% выключено. Включаем...
    pnputil /enable-device "%DEVID%"
)

endlocal

Ключевые моменты:

  • pnputil /enum-devices выводит строку вида Device ID: ACPI\SYNA2BA6\3&C8C3232&0 Status: Started.
  • findstr /i "%DEVID%" быстро находит строку с нужным ID.
  • for /f разбивает строку по : и берёт второй токен как статус.
  • if /i делает сравнение без учёта регистра.

Согласно официальной документации Microsoft, pnputil возвращает «Started» для включённых устройств и «Disabled» для выключённых – https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/pnputil-examples.

Вариант 2: использование for /f и if с расширенной разыменовкой переменных

bat
@echo off
setlocal EnableDelayedExpansion

set "DEVID=ACPI\\SYNA2BA6\\3&C8C3232&0"
set "STATUS="

:: Читаем вывод pnputil построчно
for /f "usebackq delims=" %%L in (`pnputil /enum-devices`) do (
    :: Проверяем наличие ID в строке
    echo %%L | findstr /i "%DEVID%" >nul
    if !errorlevel! equ 0 (
        :: Строка содержит ID, теперь ищем слово Status
        for /f "tokens=2 delims=:" %%S in ("%%L") do (
            set "STATUS=%%S"
        )
    )
)

:: Удаляем пробелы
set "STATUS=%STATUS: =%"

:: Переключаем состояние
if /i "!STATUS!"=="Started" (
    echo Device is started – disabling.
    pnputil /disable-device "%DEVID%"
) else (
    echo Device is disabled – enabling.
    pnputil /enable-device "%DEVID%"
)

endlocal

Пояснения:

  • EnableDelayedExpansion позволяет читать переменную STATUS внутри цикла.
  • for /f "usebackq delims=" читает строку целиком без разбиения по пробелам.
  • Внутренний for /f ищет токен после : – это статус.
  • Команда findstr с >nul подавляет вывод, но оставляет errorlevel.

Статья на Stack Overflow показывает, как использовать pnputil в batch‑скриптах: https://stackoverflow.com/questions/47530182/enabling-disabling-a-device-in-windows-10-from-command-line.

Вариант 3: объединённый скрипт с функцией и обработкой ошибок

bat
@echo off
setlocal EnableDelayedExpansion

:: --- Функция получения статуса устройства ---------------------------------
:GET_STATUS
set "DEV=%~1"
set "STAT="
for /f "tokens=2 delims=:" %%S in ('pnputil /enum-devices ^| findstr /i "%DEV%"') do (
    set "STAT=%%S"
)
set "STAT=%STAT: =%"
set "STAT=%STAT:~0,7%"
exit /b

:: --- Основная часть --------------------------------------------------------
set "DEVID=ACPI\\SYNA2BA6\\3&C8C3232&0"

call :GET_STATUS "%DEVID%"
if /i "%STAT%"=="Started" (
    echo Устройство %DEVID% включено. Отключаем...
    pnputil /disable-device "%DEVID%"
) else if /i "%STAT%"=="Disabled" (
    echo Устройство %DEVID% выключено. Включаем...
    pnputil /enable-device "%DEVID%"
) else (
    echo Не удалось определить статус устройства. Выход.
    exit /b 1
)

endlocal

Что делает скрипт:

  1. Функция :GET_STATUS принимает ID, ищет его в списке и возвращает статус в переменной STAT.
  2. Основная часть вызывает функцию, затем переключает состояние.
  3. Если статус не распознан, скрипт завершается с кодом ошибки.

Такой подход, где логика вынесена в функцию, упрощает поддержку и расширение скрипта, особенно при работе с несколькими устройствами – https://superuser.com/questions/1827841/solved-how-to-enable-and-disable-device-in-one-batch-file.

Заключение

  • Проверка статуса осуществляется через pnputil /enum-devices и поиск строки с ID устройства.
  • Переключение выполняется одной из команд pnputil /disable-device или pnputil /enable-device.
  • Batch‑скрипты могут быть простыми (один if) или более модульными (функции, расширенная разыменовка).
  • Важно запускать скрипт с правами администратора, иначе pnputil не сможет изменить состояние устройства.

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

Источники

  1. PnPUtil Command Examples for Windows Driver Management – Microsoft Learn
  2. PnPUtil Command Syntax – Microsoft Learn
  3. Stack Overflow: Enabling/disabling a device in Windows 10 from command line
  4. Super User: Solved – how to enable and disable device in one batch file
Авторы
Проверено модерацией
Модерация