Состояние берётся через PowerShell-команду Get-PnpDevice — она напрямую смотрит в Диспетчер устройств Windows и выдаёт точный код (включено/отключено/проблема). В чистом batch без каких-либо внешних вызовов (PowerShell, wmic или утилит) получить это состояние точно нельзя — нет встроенных команд для чтения статуса PnP-устройств. Текущий способ через Get-PnpDevice — один из лучших и самых точных (современный, надёжный). Альтернативы: DevCon (devcon status — проще парсить) или старый wmic (Win32_PnPEntity), но они тоже требуют вызова внешних инструментов. Batch для этого — не лучшая идея, потому что он старый и хрупкий: легко ломается на символах вроде & ( ) ^ в именах устройств, парсинг строк — сплошной геморрой, всё требует костылей. То же самое на PowerShell пишется в 10 строк без головной боли и надёжнее работает.
Наиболее понятный пример:
@echo off
setlocal
set "deviceId=ACPI\SYNA2BA6\3&C8C3232&0" rem HWID вашего устройства (замените на свой)
rem Получаем статус (предполагаем, что devcon установлен; скачайте с Microsoft)
for /f "tokens=*" %%a in ('devcon status "%deviceId%"') do (
set "status=%%a"
)
rem Условный оператор: проверяем, содержит ли статус "running" (включено)
if /i not "!status!"=="!status:running=!" (
echo Устройство включено. Отключаем...
pnputil /disable-device "%deviceId%"
) else (
echo Устройство отключено. Включаем...
pnputil /enable-device "%deviceId%"
)
echo Операция завершена.
В целом если очень надо можно написать и на Bat, получиться что-то такое, я проверил у себя, всё работает. Но написал через Get-PnpDevice :