Beep з bat-файлу.
Внутрішній виклик команди CALL.
З довідкової документації Microsoft ми знаємо, що команда Call - робить виклик одного пакетного файлу з іншого, без завершення виконання першого файлу, але мало кому відомо що за допомогою Call можна переміщатися по внутрішнім мітках того ж cmd / bat файлу, подібно команді Goto. @ Навіщо це потрібно, адже є goto? "- запитаєте ви. А потім, що крім просто переміщення по мітках команда Сall має дві особливості:
- "Вміє" повертатися до місця свого виклику за допомогою спеціальної мітки: EOF.
- Вміє передававать значення в "підпрограму". Поясню на прикладі:
@echo off
Rem Викликаємо підпрограму
call: SQRT 2
call: SQRT 8
pause
goto: EOF
rem а ось тут вже виходимо див. нижче.
rem *** Початок підпрограми. ***
: SQRT
set / a outputval =% 1 *% 1
echo Корінь з% 1 дорівнює% outputval%.
goto: EOF
rem не виходимо, але всього лише повертаємося на місце за викликом
rem *** Кінець підпрограми. ***
Після виконання даного командного сценарію отримаємо такий висновок:
Красиво, чи не так? Така непомітна можливість, може заощадити купу рядків коду, і на час може здатися, що ми програмуємо на повноцінному скриптовій мовою. Так, варто врахувати ще й те що в підпрограму можна передавати кілька аргументів, тоді звертатися до них слід так само як і до аргументів командного рядка% 1,% 2,% 3 ... і далі по порядку.
Символи екранування в bat-файл.
Що якщо вам треба вивести в консоль текст містить оператори або спецсіволи?
Наприклад, треба вивести: "% TEMP%". Спробуємо ввести в командний рядок Echo% TEMP%. результат:
На консоль вивелося значення змінної% TEMP%. Зовсім не те що нам треба ... Для таких випадків і існують символи екранування "^" і "%". Досить його підставити перед спецсимволи і інтерпретатор зрозуміє що ми хочемо вивести саме символ а не рядок або вираженіе.Для перевірки створимо батник:
@Echo off
Echo з'їси ще цих французьких булок та випий чаю ^
з'їж ще цих французьких булок та випий чаю ^
з'їж ще цих французьких булок та випий чаю ^
з'їж ще цих французьких булок та випий чаю
Echo %% TEMP %%
Pause
результат:
Як бачимо все працює і економія коду на обличчя. Не дивлячись на те, що в прикладі все відпрацювало, з екрануванням в сорочки з короткими рукавами треба бути обережнішим, не завжди все гладко, тому слід тестувати кожен скрипт.
Що таке enabledelayedexpansion?
Взагалі я не хотів писати про це, але тому що в наступному прикладі це використовується і в довідці розписано туманно, напишу.
Зазвичай при використанні змінних в bat / cmd сценаріях використовується конструкція% змінна%, однак якщо значення змінної змінюється в тілі циклу і зчитується там же, це може не працювати. наприклад:
for %% i in (1,2,3) do (
set "var = %% i"
echo% var%
Rem Чи не виведе нічого
)
pause
Якщо запустити цей приклад то інтерпретатор просто 3 рази виконає echo без будь то або параметрів. Для того щоб все працювало правильно потрібно використовувати розширений режим обробки команд. Здається він командою setlocal з параметром enabledelayedexpansion, а вимикається командою endlocal. Наведу приклад:
setlocal enabledelayedexpansion
for %% i in (1,2,3) do (
set "var = %% i"
echo! var!
Rem Виведе 1,2,3
)
Pause
Тепер все виводиться як і задумано. Зауважу що змінна в даному випадку обрамлена знаками оклику (!).
Створення динамічних змінних в bat-файлах? Легко!
При написанні сценаріїв командного рядка, у адміністраторів, які, хоча б трохи програмували на інших мовах програмування (а cmd можна віднести до них з натяжкою) виникає певний дискомфорт при обробці великих масивів даних. Адже в cmd відсутні масиви! Ми можемо обійти це обмеження з використанням динамічних змінних. Для цього скористаємося розширеним режимом обробки команд.
Наприклад є текстовий файл, нам потрібно його прочитати і вивести певні рядки на екран, покажу як це зробити за допомогою динамічних змінних. Для початку створимо файл greeka.txt з таким вмістом:
Цитувати 1.Ехал Грека через річку, Бачить Грека - в річці рак.
2.Ехал Грека через річку, Бачить Грека - в річці рак.
3.Ехал Грека через річку, Бачить Грека - в річці рак.
4.Ехал Грека через річку, Бачить Грека - в річці рак.
5.Ехал Грека через річку, Бачить Грека - в річці рак.
6.Ехал Грека через річку, Бачить Грека - в річці рак.
7.Ехал Грека через річку, Бачить Грека - в річці рак.
8.Ехал Грека через річку, Бачить Грека - в річці рак.
9.Ехал Грека через річку, Бачить Грека - в річці рак.
10.Ехал Грека через річку, Бачить Грека - в річці рак.
Далі, приступимо до написання нашого сценарію:
@echo off
setlocal enabledelayedexpansion
Включаємо режим розширеної обробки команд.
set i = 0
Оголошуємо допоміжну змінну.
for / F "tokens = *" %% a in (greka.txt) do (
Початок циклу порядкового перебору файлу.
set / A i =! i! + 1
Збільшуємо допоміжний итератор на одиницю.
set str! i! = %% a
Власне сама нехитра конструкція створення динамічних змінних, з іменами str1, str2, str3 і так далі.
)
Перевіримо як відпрацював наш сценарій.
початок циклу
Echo Це 10 рядок. ------- ^> ^>% str10%
Echo +++++++++++++++++++++++++++++++++++++++++++++
Echo +++++++++++++++++++++++++++++++++++++++++++++
Echo. а це друга ------- ^> ^>% str2%
pause
Як бачимо динамічні змінні використовувати досить зручно і легко, вони можуть допомогти вам замінити масиви і додадуть гнучкості коду.
Пошук і заміна тексту в файлах засобами cmd / bat файлу.
Багато адміністратори і Power-користувачі Лінукс, при знайомстві з можливостями cmd, помічають таку прикру деталь, як відсутність безлічі утиліт для пошуку і заміни підрядків в файлах.
Взагалі під windows існує безліч утиліт для обробки рядків у файлах, в тому числі і портірованних з #nix систем (той же sed і supersed), але ми не шукаємо легких шляхів це буде не зовсім чисто, тому що в потрібний момент цього всього може не виявитися під рукою.
Вийшов файл, забитий приказкою, розміром
10 мегабайт, непогано для прикладу ... Запустимо Наш сценарій ввівши в командному рядку "File_str_replace.bat greka.txt Грека Гітлер". для того щоб замінити всі слова Грека на Гітлер. Запустивши побачимо що через півтори хвилини (непогано для 20-ти річного консольного мамонта) в нашому файлі приказка замінилася на "Їхав Гітлер через річку, Бачить Гітлер - в річці рак.Сунул Гітлер в річку руку, Рак за руку Греку - цап". Можна удосконалити сценарій, і навіть прикрутити до неї регулярні вирази, але це вже дрібні технічні деталі