среда, 7 августа 2013 г.

Серия "В один клик": включить-выключить bluetooth (или любое другое устройство)


Если на твоём компе есть bluetooth, то, наверное, ты иногда его включаешь и выключаешь ) А если ты хоть немного разбираешься в безопасности компьютеров, то отключаешь точно – зачем он будет болтаться. Я тоже отключаю. Только процедура эта обычно неудобная — либо в трее кликать долго и мучительно, пункты выбирать... или хоткеем, если есть. Ну, допустим, хоткея нет, а кликать сто раз не хочется. Так что, без проблем! Сделаем вкл-выкл по одному и тому же клику, да ещё и хоткей повесим! Раз плюнуть!

Такой вот скрипт получился у меня:




@ECHO OFF

for /F %%p IN ('devcon status USB\VID_0B05* ^| find /C "running"') DO (set answer=%%p)

if %answer%==1 (

      devcon disable USB\VID_0B05^&PID_1715

      exit /b

)

devcon enable USB\VID_0B05^&PID_1715


Не дрейфь! Ни фига не понятно, знаю, но сейчас разберём всё по символам, и будет полное просветление!

@ECHO OFF — это служебная команда. Если оно, это Эхо, офф, то, когда запустишь скрипт, сами команды не будет видно, только их результаты. Соответственно, если ON, или если такой команды в файле нет вообще, то всё будет видно. OFF полезен, когда скрипт уже точно работает так, как надо. ON – чтобы видеть, что происходит, и отследить, где косяк (это, упрощённо говоря, то, что называют «режим отладки» - когда мы видим всё, что происходит в потрохах компьютера, чтобы точно знать, что идёт не так, и исправить это).

for /F %%p IN ('devcon status USB\VID_0B05* ^| find /C "running"') DO (set answer=%%p)

Здесь много всего. Идём по порядку:
FOR — это команда, встроенная в Windows, крутая и очень полезная (такое есть и в других языках и операционках, конечно, просто мы сейчас рассмотрим виндовый вариант). Это, говоря упрощённо, такой IF с расширенными возможностями. IF выполняется один раз, а FOR — пока не закончится то, что мы ему подсунем условием IN. В IN мы с тобой подкинем ему команду, да не одну! Если команда в IN выполнилась успешно, FOR перейдёт в DO (“сделать» по-русски), и сделает то, что мы ему там напишем, и сделает это столько раз, сколько должна будет выполниться команда в IN.

В IN мы имеем:

devcon status USB\VID_0B05* ^| find /C "running"

devcon – это внешняя программа. Скачать её можно тут - http://support.microsoft.com/kb/311272/ru. Имей в виду, что 32-битная версия на 64-ой ОС работать не будет. Прога позволяет контролировать из командной строки устройства, подключенные к компу. Для нас сейчас она полезна тем, что можно увидеть статус устройства. Зачем? Чтобы узнать, включено оно или выключено, и сделать наоборот! )
Для этого мы сделаем запрос devcon status, а дальше зададим VID нашего блютуса.

VID – это набор буквоцифр, уникальный для каждого девайса. То есть, обращаясь к устройству через VID, мы можем быть уверены, что отключим только данный конкретный блютуз, а не 10 похожих с монитором на закуску ) Звёздочка после начала VID означает «любое количество любых символов дальше». Поскольку у меня в компьютере других похожих VID нет, я оставил звёздочку. Тебе, может быть, понадобится более длинный VID, а посмотреть его можно в диспетчере устройств, в вкладке «Свойства» твоего блютуса (да и любого другого девайса тоже).

Помнишь про ERRORLEVEL? Devcon нужный нам errorlevel в данном случае не вернёт. Он скажет, что такое устройство ЕСТЬ (если ты задал правильный VID), но его статус в ERRORLEVEL не покажет. Чтобы узнать статус, заюзаем уже знакомый нам FIND.

Если блютус включен, devcon напишет «1 devices running”. Вот этот running мы и найдём:

find /C "running"

Почему перед FIND стоит | ? Это как раз одна из альтернатив ERRORLEVEL, то есть возможность передать компьютеру информацию о предыдущей команде. Если мы пишем

devcon status USB\VID_0B05* | find /C "running"

то всё, что выводит на экран devcon, будет вместо экрана «перекинуто» следующей команде, FIND в нашем случае. По сути, мы говорим файнду: НАЙДИ слово running В результатах предыдущей команды. Всё просто.



И вот файнд уже возвращает нужный нам ERRORLEVEL. Его получит команда FOR и сохранит в заданную переменную, %%p

Переменные в cmd выделяются знаками процента. Если имя переменной — одна буква, то знак процента тоже один, перед переменной. Если букв в имени переменной больше одной, то всё имя выделяется знаками процента, %ПЕРЕМЕННАЯ%. Почему в cmd/bat файле два процента перед переменной, и почему иногда появляется крышечка ^ перед символами, расскажу дальше.

Дальше FOR выполнит то, что сказано в DO. То есть сохранит наш ERRORLEVEL в другую переменную для дальнейшей обработки. Кстати говоря, если в cmd мы пишем в переменную, то сама переменная будет без процентов. А если хотим узнать значение переменной — вот тут с процентами. Поэтому set answer(записываем переменная)=%%p(читаем значение переменной).

Дальше всё просто — наш любимый IF:

if %answer%==1 (
      devcon disable USB\VID_0B05^&PID_1715
      exit /b
)

Если devcon нам сказал, что есть одно устройство со статусом running, то есть в answer у нас единица, то выполним действия. Мы выполняем несколько команд, поэтому все наши команды нужно взять в скобки, и каждую команду писать на новой строке, чтобы IF'у было понятно, когда и что выполнять.
devcon disable USB\VID_0B05^&PID_1715

ЕСЛИ устройство ВКЛЮЧЕНО ВЫКЛЮЧИТЬ устройство
exit /b
ВЫЙТИ (из файла cmd/bat – параметр /b)

Если мы не выйдем, то выполнится следующая команда:

devcon enable USB\VID_0B05^&PID_1715

ВКЛЮЧИТЬ устройство

Суть в том, что ЕСЛИ устройство ВКЛЮЧЕНО, мы ВЫКЛЮЧИМ его и ВЫЙДЕМ (в условии IF), и следующая команда не выполнится. Если устройство ВЫКЛЮЧЕНО, то в IF мы не попадём, а значит, не выйдем, и следующая команда будет ВКЛЮЧИТЬ устройство.

И нам нужно будет кликнуть всего один раз, на один значок (у меня ярлык на этот батник просто помещён в панель быстрого запуска). Просто и удобно!




И вот ещё что:

  • devcon – полезная штука, скачать его можно тут (и тут для x64 систем, x86 в x64 работать не будет)
  • скрипт можно сформулировать и проще — попробуй!
  • два процента перед переменной — так надо! ) Если просто вводить в командную строку, то один %, а если из батника — то два. А крышечка — это чтобы комп понял, что это служебный символ, а не печатный. То есть, в нашем случае | - это команда, такая же, как FIND, например.

Комментариев нет:

Отправить комментарий