Секрети командного рядка windows, vr-online - безкоштовний електронний журнал для всіх

Секрети командного рядка windows, vr-online - безкоштовний електронний журнал для всіх
На жаль, завдяки ряду незалежних від нас причин, командна оболонка cmd.exe досі не втратила своєї актуальності. Багато системні адміністратори використовують її для управління своїми завданнями, при відсутності на OS інших засобів, або в силу звички. Незважаючи свою на простоту, командний рядок має низку цікавих і неочевидних можливостей. У цьому пості я постараюся розповісти, про деякі недокументованих або маловідомих можливості командного рядка Windows.

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 *** Кінець підпрограми. ***
Після виконання даного командного сценарію отримаємо такий висновок:

Секрети командного рядка windows, vr-online - безкоштовний електронний журнал для всіх

Красиво, чи не так? Така непомітна можливість, може заощадити купу рядків коду, і на час може здатися, що ми програмуємо на повноцінному скриптовій мовою. Так, варто врахувати ще й те що в підпрограму можна передавати кілька аргументів, тоді звертатися до них слід так само як і до аргументів командного рядка% 1,% 2,% 3 ... і далі по порядку.

Символи екранування в bat-файл.
Що якщо вам треба вивести в консоль текст містить оператори або спецсіволи?

Наприклад, треба вивести: "% TEMP%". Спробуємо ввести в командний рядок Echo% TEMP%. результат:

Секрети командного рядка windows, vr-online - безкоштовний електронний журнал для всіх

На консоль вивелося значення змінної% 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-ти річного консольного мамонта) в нашому файлі приказка замінилася на "Їхав Гітлер через річку, Бачить Гітлер - в річці рак.Сунул Гітлер в річку руку, Рак за руку Греку - цап". Можна удосконалити сценарій, і навіть прикрутити до неї регулярні вирази, але це вже дрібні технічні деталі

Схожі статті