Показать полную графическую версию : [решено] Включение/отключение устройств одним .bat файлом
BuSHmaker
25-10-2013, 19:15
Помогите с батником который будет отключать устройство если оно включено и включать если оно выключено.
Знаю, что нужно использовать devcon, findstr, if и goto да с if не дружу.
Вот состояния устройства
C:\>devcon_x64.exe disable "HID\VID_045E&PID_00F9&REV_0002&MI_01&Col02"
HID\VID_045E&PID_00F9&MI_01&COL02\7&18BF0AD&0&0001 : Disabled
1 device(s) disabled.
C:\>devcon_x64.exe status "HID\VID_045E&PID_00F9&REV_0002&MI_01&Col02"
HID\VID_045E&PID_00F9&MI_01&COL02\7&18BF0AD&0&0001
Name: HID- Device is disabled.
1 matching device(s) found.
C:\>devcon_x64.exe enable "HID\VID_045E&PID_00F9&REV_0002&MI_01&Col02"
HID\VID_045E&PID_00F9&MI_01&COL02\7&18BF0AD&0&0001 : Enabled
1 device(s) are enabled.
C:\>devcon_x64.exe status "HID\VID_045E&PID_00F9&REV_0002&MI_01&Col02"
HID\VID_045E&PID_00F9&MI_01&COL02\7&18BF0AD&0&0001
Name: HID- Driver is running.
1 matching device(s) found.
Гуллипут
26-10-2013, 23:37
devcon_x64.exe status "HID\VID_045E&PID_00F9&REV_0002&MI_01&Col02"|findstr /C:"disabled"
if not errorlevel 1 (
devcon_x64.exe enable "HID\VID_045E&PID_00F9&REV_0002&MI_01&Col02"
) else devcon_x64.exe disable "HID\VID_045E&PID_00F9&REV_0002&MI_01&Col02"
Вот в таком разрезе.
BuSHmaker
27-10-2013, 02:02
Спасибо, работает.
Только нужно было devcon закинуть в system32.
Гуллипут
27-10-2013, 11:50
Только нужно было devcon закинуть в system32 »
Этого я не понял. Что значит "закинуть" и зачем ? Судя по твоим командам, он запускался просто из корня диска C: и работал, или я что-то не так понял ?
BuSHmaker
28-10-2013, 16:31
Этого я не понял. Что значит "закинуть" и зачем ? Судя по твоим командам, он запускался просто из корня диска C: и работал, или я что-то не так понял ? »
Запускался с корня он только после смены рабочего каталога на корень C:. Твой батник, без смены каталога, работал бы только при запуске с корня C:. А теперь он работает с любого места.
Я редко юзаю девкон, но уже больше года хотел её переместить какой-нибудь PATH.
Гуллипут
29-10-2013, 00:25
То есть devcon находился в корне ? Тогда понятно.
ivantresh
02-01-2017, 18:15
Моя задача немного сложнее. При загрузке системы, устройство чаще всего не запускается.
Вот, что выдаёт:
C:\Windows\system32>devcon64 status "@USB\VID_0079*PID_0007\5&326C0CBC&0&10"
USB\VID_0079&PID_0007\5&326C0CBC&0&10
Name: USB- Device has a problem: 10.
1 matching device(s) found.
Если сделать рестарт устройства 1-3 раза, через команду devcon64 restatrt, оно запускается и работает нормально.Пишет:
Driver is running.
ЗАДАЧА: Как сделать, чтобы при запуске батника:
1.Проверка статуса устройства, если оно запущено нормально (Driver is running.), то ничего не делать.
2. Если не запустилось (Device has a problem: 10.), то devcon64 restatrt. Причём команда повторялась бы до тех пор, пока устройство не запуститься, то есть в статусе будет - Driver is running. Знаю, что нужно использовать if,findstr, for, но как это реализовать - не знаю. Обновление драйверов не предлагать. Устройство устаревшее, и чего я только не перепробовал, и не только я - всё бесполезно.
Буду очень признателен за любую помощь. Заранее благодарю за ответ.
ivantresh,
допустим так:
@echo off
:st
devcon64 status "@USB\VID_0079*PID_0007\5&326C0CBC&0&10"|find /i "Driver is running" && (echo Все в порядке& goto out) || (echo Есть проблема& goto st)
:out
exit/b
но вряд-ли, перезапускать надо что-то по-глобальнее чтобы проблемный драйвер запустился и скорее после метки :st, нужна строка запуска чего-то еще.
& goto out »
и сама метка тут, в общем-то лишние.
ivantresh
02-01-2017, 23:54
Вот, что сделал я:
Файл батника
devcon64 status "@USB\VID_0079*PID_0007\5&326C0CBC&0&10"|findstr /C:"Device has a problem: 10"
if not errorlevel 1 (
devcon64 restart "@USB\VID_0079*PID_0007\5&326C0CBC&0&10"
)
Как бы сюда вставить цикл for или goto, что бы устройство пере запускалось пока не запустится нормально + небольшие паузы после каждого рестарта ? Лишний рестарт может привести к той же ошибке. Нужно, чтобы устройство пере запускалось (команда devcon64 restart) до тех пор, пока нормально не запустится. То есть команда devcon64 status выдаст строку - Driver is running. Обычно бывает достаточно одного перезапуска, но иногда 2-3, очень редко 4. А иногда перезапуск вообще не нужен.
ivantresh
04-01-2017, 09:31
Проблему решил.
:loop
devcon_x64 status "@USB\VID_0079*PID_0007\5&326C0CBC&0&10"|findstr /C:"Device has a problem: 10"
if not errorlevel 1 (
devcon_x64 restart "@USB\VID_0079*PID_0007\5&326C0CBC&0&10"
timeout /t 1 /nobreak
goto loop
) else (
start C:\RAB\MSGPULTRUN.vbs
)
У меня ситуация хуже: есть две интегрированные сетевые платы, нужно отключить одну из них. Разница там в одной цифре, 1-я плата - PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E4
2-я PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5
Ввожу команду devcon disable PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5 - вырубает обе :(
Не знаю, что и делать.
P.S. Через wmic или netsh не предлагать :)
Не знаю, что и делать. »
Например, не забывать о том, что в командной строке символ «&» имеет особый смысл. Проще всего заключить идентификатор устройства в кавычки.
Iska,
Вот так?
D:\>devcon disable "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5"
No matching devices found.
VasyaOK, так.
Покажите последовательно:
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5"
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0"
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD"
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4"
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458"
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5" »
No matching devices found.
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0" »
No matching devices found.
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD" »
No matching devices found.
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4" »
No matching devices found.
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458" »
PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5: Realtek PCIe GbE Family Controller
PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&525529E&0&00E4: Realtek PCIe GbE Family Controller #2
2 matching device(s) found.
Отключать нужно 1-ю.
VasyaOK, теперь так:
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02"
Iska,
PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5: Realtek PCIe GbE Family Controller
PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&525529E&0&00E4: Realtek PCIe GbE Family Controller #2
2 matching device(s) found.
VasyaOK,
очевидно из этого что окончание "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\***" - рандомное
выше и последнее
4&2E680ECD&0&00E4
4&525529E&0&00E4
поэтому и находит только по "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02"
брать нужное можно именно таким образом, искать по этой строке потом внутри строки #2 (убедившись что это всегда принадлежит строке, например именно ...E4 или по E4 сразу и искать), а далее при положительном результате (&&) уже давать на выполнение в devcon.exe эту найденную нужную строку.
т.е. примерно так:
@echo off
for /f "delims=:" %%a in ('devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02"^|find /v "matching"') do (
<nul set /p="%%a"|>nul findstr /e "E4" && devcon.exe disable "%%a"
)
pause
По-моему, лучше сделать проще:
http://www.nncron.ru/forums/viewtopic.php?p=17887&sid=b705da0b47ed365f78394b028d571dc1#p17887
Я, конечно, попробую ваш вариант - интересно же ;), но, насколько я понял, решение поставленной задачи в рамках devcon - ПРОБЛЕМА...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.