Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Включение/отключение устройств одним .bat файлом (http://forum.oszone.net/showthread.php?t=270681)

BuSHmaker 25-10-2013 19:15 2241086

Включение/отключение устройств одним .bat файлом
 
Помогите с батником который будет отключать устройство если оно включено и включать если оно выключено.
Знаю, что нужно использовать 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 2241652

Код:

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 2241698

Спасибо, работает.
Только нужно было devcon закинуть в system32.

Гуллипут 27-10-2013 11:50 2241807

Цитата:

Цитата BuSHmaker
Только нужно было devcon закинуть в system32 »

Этого я не понял. Что значит "закинуть" и зачем ? Судя по твоим командам, он запускался просто из корня диска C: и работал, или я что-то не так понял ?

BuSHmaker 28-10-2013 16:31 2242631

Цитата:

Цитата Гуллипут
Этого я не понял. Что значит "закинуть" и зачем ? Судя по твоим командам, он запускался просто из корня диска C: и работал, или я что-то не так понял ? »

Запускался с корня он только после смены рабочего каталога на корень C:. Твой батник, без смены каталога, работал бы только при запуске с корня C:. А теперь он работает с любого места.
Я редко юзаю девкон, но уже больше года хотел её переместить какой-нибудь PATH.

Гуллипут 29-10-2013 00:25 2242918

То есть devcon находился в корне ? Тогда понятно.

ivantresh 02-01-2017 18:15 2700211

Моя задача немного сложнее. При загрузке системы, устройство чаще всего не запускается.
Вот, что выдаёт:

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, но как это реализовать - не знаю. Обновление драйверов не предлагать. Устройство устаревшее, и чего я только не перепробовал, и не только я - всё бесполезно.

Буду очень признателен за любую помощь. Заранее благодарю за ответ.

alpap 02-01-2017 21:47 2700257

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, нужна строка запуска чего-то еще.

Iska 02-01-2017 22:49 2700264

Цитата:

Цитата alpap
& goto out »

и сама метка тут, в общем-то лишние.

ivantresh 02-01-2017 23:54 2700273

Вот, что сделал я:

Файл батника

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 2700564

Проблему решил.

: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
)

VasyaOK 29-03-2019 18:57 2865826

У меня ситуация хуже: есть две интегрированные сетевые платы, нужно отключить одну из них. Разница там в одной цифре, 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 29-03-2019 19:16 2865829

Цитата:

Цитата VasyaOK
Не знаю, что и делать. »

Например, не забывать о том, что в командной строке символ «&» имеет особый смысл. Проще всего заключить идентификатор устройства в кавычки.

VasyaOK 29-03-2019 19:58 2865839

Iska,
Вот так?
D:\>devcon disable "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5"
No matching devices found.

Iska 29-03-2019 22:31 2865867

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"


VasyaOK 30-03-2019 10:07 2865890

Цитата:

Цитата Iska
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5" »

No matching devices found.
Цитата:

Цитата Iska
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0" »

No matching devices found.
Цитата:

Цитата Iska
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD" »

No matching devices found.
Цитата:

Цитата Iska
devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4" »

No matching devices found.
Цитата:

Цитата Iska
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-ю.

Iska 30-03-2019 12:50 2865920

VasyaOK, теперь так:
Код:

devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02"

VasyaOK 30-03-2019 13:38 2865934

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.

alpap 30-03-2019 14:40 2865947

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


VasyaOK 30-03-2019 15:10 2865955

По-моему, лучше сделать проще:
http://www.nncron.ru/forums/viewtopi...d571dc1#p17887
Я, конечно, попробую ваш вариант - интересно же ;), но, насколько я понял, решение поставленной задачи в рамках devcon - ПРОБЛЕМА...

alpap 30-03-2019 15:37 2865961

Цитата:

Цитата VasyaOK
лучше сделать проще »

чем решение в одну строку на cmd?
Цитата:

Цитата VasyaOK
решение поставленной задачи в рамках devcon »

какие рамки вас смущают? Начнем с того что с devcon вы работаете в рамках cmd и задачу я решил тоже в этих же рамках cmd - так в чем проблема?

VasyaOK 30-03-2019 15:59 2865964

Цитата alpap:
чем решение в одну строку на cmd? »
Тем, что работает. А "решение в одну строку на cmd" - нет. Только этим ;). Вот, что выдаётся:
Код:

No matching devices found.
Для продолжения нажмите любую клавишу . . .

Кстати, 'pause' можно убрать - я запускаю все подобные вещи через FAR; ошибки мне прекрасно видны...
Цитата alpap:
какие рамки вас смущают? Начнем с того что с devcon вы работаете в рамках cmd и задачу я решил тоже в этих же рамках cmd - так в чем проблема? »
Код:

на машине с несколькими сетевками с однотипным чипсетом DEVCON у меня выключал все сетевки, хотя просили только одну - такие вот спецэффекты...
Ссылку я уже выше приводил...
Нет, если получится (с DEVCON) я не возражаю - боже упаси! Просто мне кажется, CNIC - не случайно возник ;). Такая вот рифма.

alpap 30-03-2019 16:29 2865967

VasyaOK, какой вывод этого?
Код:

@echo off
for /f "delims=:" %%a in ('devcon.exe find "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02"^|find /v "matching"') do (
 echo "%%a"
)
pause


VasyaOK 30-03-2019 16:34 2865968

alpap,

"PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5"
"PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&525529E&0&00E4"

alpap 30-03-2019 16:37 2865970

значит так выводит нужную строку, так?
Код:

@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" && echo "%%a"
)
pause


VasyaOK 30-03-2019 16:48 2865971

alpap,
"PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&525529E&0&00E4"
А мне нужно отключать
"PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5"

alpap 30-03-2019 17:10 2865975

VasyaOK,
ну поменяйте E4 на E5, но "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5" это именно ID? Иначе отключит только по "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02", а сюда обе строки попадают.

Iska 30-03-2019 17:31 2865977

VasyaOK, даже не знаю, что посоветовать.

У меня, кстати, точно так же. Пока я задаю в команде «devcon.exe find» только Hardware ID — ищет и находит:



Как только я пытаюсь добавить к Hardware ID ещё и Instance ID конкретного устройства:
Цитата:

Код:


PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_0C\4&1DCB0711&0&00E2
    Name: Realtek PCIe GBE Family Controller
    Hardware IDs:
        PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_0C
        PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458
        PCI\VEN_10EC&DEV_8168&CC_020000
        PCI\VEN_10EC&DEV_8168&CC_0200
    Compatible IDs:
        PCI\VEN_10EC&DEV_8168&REV_0C
        PCI\VEN_10EC&DEV_8168
        PCI\VEN_10EC&CC_020000
        PCI\VEN_10EC&CC_0200
        PCI\VEN_10EC
        PCI\CC_020000
        PCI\CC_0200


— увы и ах:



В связи с чем возникает вопрос — а умеет ли работать DevCon с Instance ID в принципе? Либо это я что-то не так делаю?

VasyaOK 30-03-2019 17:51 2865984

Цитата:

Цитата alpap
ну поменяйте E4 на E5 »

Не очень понял, чего менять...
Цитата:

Цитата alpap
но "PCI\VEN_10EC&DEV_8168&SUBSYS_E0001458&REV_02\4&2E680ECD&0&00E5" это именно ID? »

Ну, конечно - их всего 2-е строки.
Так как будет выглядеть команда на отключение?

Iska,

Повторюсь: http://www.nncron.ru/forums/viewtopi...d571dc1#p17887

alpap 30-03-2019 18:32 2865990

VasyaOK, проверил ваш cnic, да, так отключает (по имени):
Код:

cnic.exe "Имя адаптера (сетевого подключения)" -d

VasyaOK 30-03-2019 18:38 2865991

Цитата:

Цитата alpap
VasyaOK, проверил ваш cnic, да, так отключает (по имени) »

Он не мой, а M$ ;) И чего бы ему не работать - его специально для этого сделали. Видать, когда с DEVCON прокололись.
А мне бы, в сою очередь, хотелось бы проверить ваш cmd ;)
Если это возможно, конечно.

alpap 30-03-2019 18:52 2865992

вот как будет работать вариант с отключением по номеру с помощью cnic
Код:

@echo off
for /f "tokens=1,2* delims=- " %%a in ('cnic.exe -l^|find "-"') do echo %%a [%%b] [%%c]
:: Например по номеру
:: cnic.exe n:0 -d
pause

и да, в имени сетевого подключения не должно быть пробелов иначе вывод информации будет неправильный (но cnic.exe n:НОМЕР -d отработает правильно).
если есть пробелы в имени сетевого подключения, то просто посмотреть или еще как использовать имя подключения и имя адаптера можно так
Код:

@echo off
for /f "tokens=1* delims=- " %%A in ('cnic.exe -l^|find "-"') do for /f "tokens=1* delims=- " %%a in ("%%B") do echo %%A [%%a] [%%b]
pause

Цитата:

Цитата VasyaOK
А мне бы, в сою очередь, хотелось бы проверить ваш cmd »

я же написал - отключит только по Hardware ID, а у вас там две строки, т.е. вероятнее всего вырубит и E4 и E5

Iska 30-03-2019 21:23 2866006

VasyaOK, насколько я понимаю, cnic.exe работает как работало отключение/подключение сетевого соединения в Windows XP, а devcon.exe работает как отключение/подключение в Windows 7, где «отключение» вызывает отключение не соединения, а самого устройства. Если Вам на самом деле нужно отключение/подключение сетевого соединения, а не устройства, то, разумеется, пользуйте cnic.exe (например, «засунув» его вызов в User Menu Far Manager'а).

Цитата:

Цитата VasyaOK
Он не мой, а M$ И чего бы ему не работать - его специально для этого сделали. Видать, когда с DEVCON прокололись. »

Если мне не изменяет память, cnic.exe — куда более старая утилита, нежели DevCon.

VasyaOK 01-04-2019 07:26 2866153

Цитата:

Цитата Iska
Если Вам на самом деле нужно отключение/подключение сетевого соединения, а не устройства, то, разумеется, пользуйте cnic.exe (например, «засунув» его вызов в User Menu Far Manager'а). »

Да мне, на самом деле, "до без разу" - работает, да и ладно ;).
Цитата:

Цитата Iska
Если мне не изменяет память, cnic.exe — куда более старая утилита, нежели DevCon. »

Может быть - не спорю. У них там косяк на косяке ;)

Цитата:

Цитата alpap
вот как будет работать вариант с отключением по номеру с помощью cnic »

Я имел ввиду вариант с DEVCON - то, что с помощью cnic работает без проблем - давно известно. Просто вариант на предыдущей странице, конкретно вот этот:
http://forum.oszone.net/post-2865970-25.html
выводит одну строку, правда не ту. У меня тогда возможности не было проверить, показалось что "решение близко". Сейчас вот проверил: ну да, замена "Е4" на "Е5" выводит нужную строку. Только толку-то от этого? Насколько я понимаю, проблему отключения именно Е5 это не решает, а значит, DEVCON - это НЕРАБОЧЕЕ РЕШЕНИЕ. На этом и закончим, пожалуй. Если, конечно у вас нет вариантов именно с DEVCON.

alpap 01-04-2019 21:57 2866239

Цитата:

Цитата VasyaOK
Только толку-то от этого? »

совершенно верно.
Цитата:

Цитата VasyaOK
нет вариантов именно с DEVCON »



Время: 20:24.

Время: 20:24.
© OSzone.net 2001-