Работа со строками в командных файлах Windows 7
Позавчера мне пришлось написать простенький командный файл, бекапящий профиль приложения. В качестве имени папки с резервной копией мне возжелалось использовать переменные окружения %date% и %time%. Если вы проходили в институте начальный курс информатики, вы должны знать, что %time% в этом случае является ничем иным, как граблями, остро торчащими на пути, так значение содержит недопустимый символ ":". Я никогда не занимался разбором строк в командных файлах, и случай как нельзя лучше подходил для того, чтобы прокачать свои скилы.
Я хочу поделиться с вами своими изысканиями, и анонсирую скучную, унылую техническую статью. Дочитавшему до конца - покажу котика.
Замена символов/подстроки в переменной командной строки
Это то, что мне было нужно в первую очередь. Напомню, моя задача в первую очередь избавиться от двоеточий.
Решается очень просто:
В этом примере используется синтаксис вида:
В моем случае заменяется двоеточие на символ нижнего подчеркивания, и результат выглядит так:
Само собой, можно заменять не отдельные символы, а целые словосочетания:
Как ещё можно воспользоваться функцией замены? Например:
Удалить все пробелы из значения переменной[code]echo %var: =%[/code]
Замена какой-либо части строкиВы можете использовать символ "*" для определения того, что обработке подлежит часть строки, предшествующая указанному выражением. Я не знаю, как написать это по-человечески, вот что я имею ввиду:
К сожалению, "звёздочкой" нельзя указать, что отсечь надо часть строки после указанного выражения. Эта задача решается в два этапа:
- в отдельную переменную помещается строка, из которой удалено всё, что находится до ключевого выражения. Т.е. в ней остается "хвост", искомое выражение плюс всё, что после него.
- затем из оригинальной переменной удаляется значение переменной, полученной на первом шаге. Здесь потребуется вызов команды СALL:
Инструкция CALL необходима для разворачивания значения переменной, подлежащей замене. Без неё интерпретатор отработает неверно, и вот эта конструкция не сработает:
[code]call echo %var1:%var%=%[/code]
Не забывайте, что при использовании таких конструкций в командных файлах знаки процентов должны быть удвоены:
[code]rem Работаем внутри командного файла
call echo %%var1:%var%=%%[/code]
Поиск подстроки
Используя опыт, полученный выше, можно написать простейшую проверку вида "содержит/не содержит".
Например, вот так:
[code]set var1=Мама мыла раму set var2=%var1:Мама=%
if NOT "%var1%" == "%var2%" (echo Подстрока найдена)[/code]
[code]set var1=Мама мыла раму set var2=%var1:Мама=%
if NOT "%var1%" == "%var2%" (echo Подстрока найдена) else (echo Подстрока не найдена) [/code]
Выделение подстроки из переменной
Для получения подстроки из строки командный интерпретатор предоставляет такую конструкцию:
начальная_позиция% set var2=%var1:
начальная_позиция,-отбросить_символов_с_конца_строки% set var2=%var1:
Синтаксис очень простой, поэтому сразу перейдем к примерам.
Выделение подстроки с начиная определенной позиции Выделение части строки, например, "середины" Выделение определенного количества символовНачальная позиции строки - нулевая.
Работа с наборами "ключ - значение"
Здесь, в общем-то, тоже никакой магии нет. В основе разбора лежит всё та же рассмотренная выше замена подстроки на пустое значение.
Алгоритм действий такой:
- Создается переменная, содежащая в себе значения вида <ключ><разделитель значения><значение><разделитель пары>. Назовем её условно "словарь".
- В переменную, которая будет содержать значение, записывается всё, что следует после ключа. По аналоги с заменой части строки, нужно использовать звездочку перед выражением <ключ><разделитель значения>.
- Полученный результат нужно "почистить", так как он может содержать в себе остаток словаря. Для этого прибегнем к хитрости и выполним составную команду. Предположим, мы в качестве разделителя пары словаря используем точку с запятой. Тогда мы сможем довольно изящно "убить" оставшуюся часть словаря, поместив его в комментарии командой rem. [code]set value=%value:;=&rem %[/code] После rem - пробел, это важно(rem /?)
Теперь практический пример:
Я надеюсь, эта информация оказалась для вас полезной и сэкономит вам время, если у вас появится задача обработки строк. Впрочем, тему я раскрыл не полностью, и если у вас есть какие-то дельные личные наработки и приёмы обработки строк в командном интерпретаторе Windows, я совсем не против увидеть их в комментариях.
Материалы по теме:
Спасибо, что дочитали до конца.
💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.
Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!
Вы здесь: Главная страница » Windows » Windows 7 » Работа со строками в командных файлах Windows 7
Публикации по теме
Автор: Сергей Ткаченко
Сергей Ткаченко создал этот сайт в далёком 2009 году, и с тех пор продолжает над ним работать, публикуя новые материалы о Windows и её приложениях практически каждый день. Посмотреть все записи автора Сергей Ткаченко
Работа со строками в командных файлах Windows 7: 15 комментариев
Полезные приемы, спасибо. Не совсем понял заключительную часть о наборах «ключ — значение». С учетом того, что материал рассчитан на начинающих скриптовиков, можно было объяснить назначение фичи получше. Пример это не слишком раскрывает…