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

Как писать cmd/bat скрипты? Легко!



Эта статья про то, что командная строка и скрипты — это круто! Даже под виндой )

Если ты любишь настраивать компьютер точно под себя, или нужно одновременно настраивать много машин — тут инфа как раз для тебя. Заодно ты узнаешь, что значат все эти if %errorlevel% и for delims. Это не заклинания для вызова адского сотоны... вернее, после прочтения статьи ты поймёшь, что эти слова значат и будешь вызывать Адского Сотону Автоматизации самостоятельно ))

Ну, готов? Поехали!


Предположим, нам надо регулярно (часто) чистить кучу компов от временных файлов. Это можно делать руками, но это натурально тупо и долго, особенно если компов много. Мы же крутые автоматизаторы, а?! Значит, нам нужен скрипт. Ты только представь — один раз его написал, и больше никаких лазаний по профилям пользователей, по запрятанным скрытым папкам, никаких «подтверждений удаления» - в общей, никакой дурацкой обезьяньей работы, а комп всегда чистый сам! Да ещё и не просто чистый, а с параметрами — например, удаляем старые файлы только те, которые старше месяца. Или сжимаем из и кладём в архив для бэкапа. Или вообще делаем авторан на флешке, и всё, что нужно будет сделать — это вставить флешку. И пока скрипт работает, можно попить чая с симпатичной владелицей компа ) Ну, ты понял. Приступаем )

Для того, чтобы сваять собственный скрипт, нам нужно иметь хоть некоторое представление о программировании. Не дрейфь, там всё просто ) Если ты, (как и я когда-то) из программирования только писал что-то в школе на допотопном языке, или вообще не имел с этим дела, то сейчас мы быстренько пробежимся по основам, и будем в скриптах чувствовать себя сухо и комфортно.

В программировании и в наших будущих скриптах, по сути, есть только две важные штуки: переменные и команды.
Переменная — это, если совсем просто, некая информация, обычно число, буква или строка. Например, z = 1 означает, грубо, что переменная, которая называется z, имеет значение 1. То есть, z + 1 будет равно 2 и означает то же самое, что 1+1. А называется переменной потому, что z может быть равно чему угодно, не только 1. Какой мы захотим, такой ещё и сделаем. Если мы напишем z = 2, то z будет равен чему?

Надеюсь, ты догадался, что двум ) Можем сделать даже так:

z = “Mjaso_MJASO”

, и тогда z будет иметь значение какое? Да, там будет Mjaso_MJASO )) Прибавить к этому значению 1, как в прошлый раз, уже не выйдет, зато можно вывести на экран, например, так:

print z 
(print – это, грубо говоря, стандартная команда компьютеру «вывести что-то на экран»)

и на экране появится наше Mjaso_MJASO ))

Кстати говоря, мы уже незаметно успели дать компьютеру две команды. Команда говорит, что мы хотим от компьютера, что ему нужно сделать, это как «сидеть» для собаки. При этом, точно также, как если мы скажем собаке вместо «сидеть» «А ну сиди на земле, глупое мохнатое животное!!», собака не поймёт и не сядет; компьютер тоже не оценит, если вместо print мы напишем prindt или напечатай_ка_мне ). То есть, надо быть внимательным при задании команд, с этим обычно связано 90% «странных глюков». Если будешь внимательным сразу, сэкономишь себе кучу времени на другие интересные занятия ;)

Попробуй догадаться, какую ещё команду мы уже использовали.
Кроме вывода на экран, мы указали компьютеру сделать ещё одно дело, связанное с переменной z. Сначала z у нас было равно 1, а потом? А потом Мясу ) То есть, мы скомандовали компьютеру записать значение в переменную. Переменная — это что-то вроде ящика с именем, куда мы можем положить нужные нам вещи, чтобы потом оттуда их быстро достать. А еще мы можем командовать компьютеру менять содержимое ящиков автоматически в соответствии с нашим хитрым планом ) Например, если мы захотим, чтобы компьютер считал подряд, то сделаем, грубо говоря, так:

z = z +1

Гляди, что происходит: компьютер возьмёт инфу из «ящика» по имени Z. Там сейчас лежит единица. Компьютер сложит 1 из ящика и 1, которую мы ему явно задали. И результат, который будет, соответственно, 2, положит в ящик с именем Z. То есть, у нас в z окажется 2. И каждый раз, когда эта программа будет запускаться, в Z будет прибавляться по одному, то есть компьютер будет считать подряд ) Такой наш хитрый план называется алгоритм.

Чтобы компьютер не фигачил постоянно одно и то же, нам нужно указать ему, когда или в каком случае делать то или иное действие. Тут нам поможет основа всех основ, из которой, грубо говоря, все программы и состоят, - команда «если», IF по-английски.

Если мы возьмём наши две предыдущие команды и скомбинируем их, то можем сделать, например, такую штуку:

z = z +1
if z = 3 print "Ух ты, круто! Зэт равно трём!! Работает!"

Что происходит: сначала заставляем компьютер считать подряд, а когда он досчитает до трёх — то пусть напишет нам радостную фразу )) Всё просто, а? Это, кстати, тоже алгоритм. Мы заставляем компьютер действовать в соответствии с нашим хитрым планом )) Ну как, уже чувствуешь себя Чёрным Властелином? ))

Если ты понял (а чего там непонятного?) всё, что было выше, то со скриптами у нас всё будет отлично, уже можем начинать их писать )


Ещё очень круто в скриптах то, что почти все нужные операции уже сделаны за нас. Например, если мы хотим найти число 42 в куче чисел, нам не надо делать так:

z = следующее_число
if z = 42 print "НУ НАКОНЕЦ-ТО, НАШЁЛ!!!"

и запускать эту программу до посинения ))

Мы напишем просто find 42

Только сначала надо узнать, какие правила использует этот find, чтобы правильно ему скомандовать. Это так же, как говорить на русском или любом другом языке: если мы скажем «нйадии минеэ сорааак дывыааа хааачу очиень!», нас не поймут ) Вот и этот find тоже, скорее всего, должен будет выглядеть примерно так:

find -s 42 in “numbers.txt”

так компьютер поймёт, что мы ищем именно числа (мы говорим ему -s, что может означать, например, «искать только числа»; согласись, написать -s гораздо быстрее, чем «ищи-ка ты мне, дорогой, только числа» – понимаешь, в чём суть? ;) ) в файле (in по-английски «в») numbers.txt , где, например, свалена та самая куча чисел.

А если мы захотим, например, выполнить следующую команду в зависимости от результатов предыдущей? Ну-ка, предположи, как это будет выглядеть.
Скорее всего, что-то вроде:

find -s 42 in “numbers.txt”
IF оно_было_найдено print “Найдено!

Заметил, что «оно_было_найдено» - команда несколько неоднозначная? На самом деле, если мы запустим find -s 42 in «numbers.txt», оно выведет нам на экран что-то вроде «found in line 5». Ты будешь удивлен, но компьютер со своего собственного экрана читать не умеет и этого результата не увидит и не поймет. То есть, если мы напишем IF found in line 5 print «Найдено!» – ничего не заработает. На самом деле, существуют способы проще и быстрее, чем компьютеру пытаться понять человеческий язык. Самый простой способ сообщить компьютеру, что произошло в результате выполнения предыдущей команды — это код ошибки, или код возврата. Это, грубо говоря, такая глобальная переменная, в которую каждая операция, когда она заканчивается, кладёт цифру. В Windows эта переменная называется ERRORLEVEL. В самом простом случае цифр всего две: 0 — если всё ОК, в нашем случае 42 найдено, и 1 — если что-то не так, в нашем случае 42, соответственно, не найдено. Ещё вместо 1 могут быть разные значения, которые будут означать какую-то конкретную ситуацию: например, 1 — вообще не найдено, 2 — ошибка оперативной памяти, 3 — нет такого файла, и так далее. 0 — это всегда ОК.

Узнать, что там сейчас в этой переменной, мы можем, если спросим виндовый комп про ERRORLEVEL, вот так, например: print %ERRORLEVEL% (почему оно в процентах, расскажу позже). На экране появится 0, 1 или что-то ещё, в зависимости от того, какой был результат команды.

Ну, мы же можем его не только посмотреть, но и проверить! То есть, наш скрипт будет выглядеть так:

find -s 42 in “numbers.txt”
IF %ERRORLEVEL% == 0 print "Найдено!"

Команд, которые уже написаны за нас, уже целая куча. Часть команд уже встроена в операционки, часть можно найти и скачать. От нас потребуется только расставить, грубо говоря, IF'ы, чтобы рассказать компу, когда и что делать. Просто, а пользы – тонна! ))


Теперь ты знаешь основы скриптостроения, и, немного подумав, сможешь писать их сам, любые, какие тебе понадобятся. Чтобы закрепить и углубить знания, мы с тобой разберём по костям один простой скрипт, который я написал для домашнего удобства. Вперёд!

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

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