Как переключить устройство в 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: простая проверка статуса и переключение
- Вариант 2: использование
for /fиifс расширенной разыменовкой переменных - Вариант 3: объединённый скрипт с функцией и обработкой ошибок
- Заключение
- Источники
Вариант 1: простая проверка статуса и переключение
@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 с расширенной разыменовкой переменных
@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: объединённый скрипт с функцией и обработкой ошибок
@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
Что делает скрипт:
- Функция
:GET_STATUSпринимает ID, ищет его в списке и возвращает статус в переменнойSTAT. - Основная часть вызывает функцию, затем переключает состояние.
- Если статус не распознан, скрипт завершается с кодом ошибки.
Такой подход, где логика вынесена в функцию, упрощает поддержку и расширение скрипта, особенно при работе с несколькими устройствами – 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не сможет изменить состояние устройства.
Попробуйте каждый из предложенных вариантов, выберите тот, который лучше вписывается в ваш рабочий процесс, и адаптируйте под несколько устройств, если потребуется.