Выделение определенного количества символов
Начальная позиции строки – нулевая.
Выделение подстроки из переменной
Для получения подстроки из строки командный интерпретатор предоставляет такую конструкцию:
[code]set var2=%var1:~начальная_позиция%set var2=%var1:~начальная_позиция,-отбросить_символов_с_конца_строки%set var2=%var1:~начальная_позиция,длина%[/code]Синтаксис очень простой, поэтому сразу перейдем к примерам.
Замена какой-либо части строки
Вы можете использовать символ “*” для определения того, что обработке подлежит часть строки, предшествующая указанному выражением. Я не знаю, как написать это по-человечески, вот что я имею ввиду:
К сожалению, “звёздочкой” нельзя указать, что отсечь надо часть строки после указанного выражения. Эта задача решается в два этапа:
- в отдельную переменную помещается строка, из которой удалено всё, что находится до ключевого выражения. Т.е. в ней остается “хвост”, искомое выражение плюс всё, что после него.
- затем из оригинальной переменной удаляется значение переменной, полученной на первом шаге. Здесь потребуется вызов команды СALL:
Инструкция CALL необходима для разворачивания значения переменной, подлежащей замене. Без неё интерпретатор отработает неверно, и вот эта конструкция не сработает:
Замена символов/подстроки в переменной командной строки
Это то, что мне было нужно в первую очередь. Напомню, моя задача в первую очередь избавиться от двоеточий.
Решается очень просто:
[code]set mytime=%time::=_%[/code]В этом примере используется синтаксис вида:
[code]%Переменная:ЧтоНайти=НаЧтоЗаменить%[/code]В моем случае заменяется двоеточие на символ нижнего подчеркивания, и результат выглядит так:
Само собой, можно заменять не отдельные символы, а целые словосочетания:
Как ещё можно воспользоваться функцией замены? Например:
Как получить часть строки в windows cmd
Я пытаюсь получить часть строки из файла и записать ее в переменную с помощью win CMD, но файл имеет несколько строк, и мне нужна только часть третьей строки. Например, файл “myfile.txt” содержит следующие строки:
package:com.test0.android
package:com.test1.android
package:com.test2.android
package:com.test3.android
И мне нужно написать только “com.test2.android” в переменную, но я не могу найти решение, как это сделать. Может ли кто-нибудь помочь мне, пожалуйста?
Не уверен, что это то, что вы ищете. Но попробуйте
set str=package:com.test0.android
set str=%str:package:=%
Поиск подстроки
Используя опыт, полученный выше, можно написать простейшую проверку вида “содержит/не содержит”.
Например, вот так:
[code]set var1=Мама мыла рамуset var2=%var1:Мама=%Работа с наборами “ключ – значение”
Здесь, в общем-то, тоже никакой магии нет. В основе разбора лежит всё та же рассмотренная выше замена подстроки на пустое значение.
Алгоритм действий такой:
Урок 9 по cmd – цикл for, обработка текстовых строк |
В этой статье мы рассмотри как используется цикл командной строки for для обработки текстовых строк и файлов. Тут будет фигурировать ключ /f, который меняет логику работы цикла командной строи (cmd) for и позволяет производить разбор любого текста по полочкам, так сказать.
Давайте начнем…
Для обработки текста или содержимого текстового файла применяется следующая конструкция:
for /f [“параметры”] %%переменная in (источник) do (оператор)
Тут “параметры” задают параметры поиска, мы их рассмотрим ниже, “источник” – тут нужно указать или путь к текстовому файлу, или текст, или вывод команд, “оператор” – тут собственно, находятся команды для обработки текста. Сам текст можно хранить в переменной, имя которой мы зададим в качестве источника.
Значение “параметры” может быть одним или комбинацией таких параметров:
eol – позволяет задать признак концевого комментария (end-of-line comment character). Весь текст, что будет находиться после него, будет приниматься за комментарий, например,“eol=#” – тут символ # является признаком концевого комментария. Собственно, комментарий не будет обрабатываться.
skip – позволяет в цикле cmd for задать количество строк, которые нужно пропустить, счет идет с начала файла, например, “skip=10” – в данном случае будут пропущены строки от первой до десятой.
delims – параметр позволяет задать дополнительные разделители строки на подстроки. Так, стандартными разделителями является пробел и символ табуляции. Например, “delims=,.:” – тут мы определили, что запятые, точки и двоеточия являются разделителями.
tokens – данный параметр командной стоки цикла for cmd позволяет указать, какие номера полей строки, полученных из заданного текста, нужно передать для обработки в цикл. Полученные поля будут храниться в отдельной переменной. Фактически, если принимать каждое слово строки как отдельный элемент, то параметр tokens позволяет указать, какие именно слова по счету нужно обработать. Как упоминалось выше, стандартным разделителем является пробел и табуляция.
Для дополнительной переменной, как и для переменной инициализации, в качестве имени указывается латинская буква, большая или маленькая. Значения можно указывать как через запятые, например, “tokens=1,4, 9” – первый, четвертый и девятый элемент, так и через диапазон, например, “tokens=4-11” – с четвертого по одиннадцатый. Можно комбинировать: “tokens=4-10,15,20” – с четвертого по десятый, а также, пятнадцатый и двадцатый элемент. Если мы укажем в качестве последнего значения звездочку, то создастся еще одна переменная, которая будет хранить в себе все остальные элементы (строки) текста.
usebackq – данный параметр является довольно интересным и полезным, так как позволяет выполнять команды, передав их как параметр. Включив этот параметр, двойные кавычки будут применяться для имен файлов и пути к ним, обратные кавычки (`), они находятся на той же кнопке, что и символ (~) – для исполняемых команд, а одинарные кавычки – для литеральных строк.
Хорошо, теперь можно рассмотреть цикл cmd for и работу с ним на практике.
Допустим, у нас есть файл test.txt, в котором прописаны такие строки:
100 200 300
#это комментарий
400 500 600
10; 20; 30;
Попробуем выполнить такой код:
На выходе функция echo выведет:
100
400
10;
Как видим, строка с комментарием не вывелась, но и остальные строки вывелись не полностью, что бы это исправить, напишем так:
Бинго, теперь нам вывело все строки полностью, кроме строки с комментариями, так как мы указали в параметре tokens значение *, то есть все. В предыдущем примере сценарий принимал пробелы как разделители.
Теперь запишем в текстовый файл такой текст:
Ukraina-Kijev-grivna-salo
Rossija-Moskva-rubl-bliny
Belorussija-Minsk-zajec-kartoska
Chechija-Praga-krona-pivo
Тут мы указали, что разделителем является тире, и указали, что надо обработать первые четыре поля строки, каждое из которых хранится в отдельной переменной. Как видим, в цикле for cmd идет обработка каждой строки из текста, на выходе мы получим:
Strana:Ukraina Stolica:Kijev Valuta:grivna Produkt:salo
Strana:Rossija Stolica:Moskva Valuta:rubl Produkt:bliny
Strana:Belorussija Stolica:Minsk Valuta:zajec Produkt:kartoska
Strana:Chechija Stolica:Praga Valuta:krona Produkt:pivo
Я специально вставил между строк пустую (echo.) что бы было лучше видеть.
Осталось рассмотреть пример с параметром usebackq:
В данном случаем мы выполняем команду: записываем фразу “Hello, Wold” в текстовый файл, путь к которому содержится в переменной get_dir. В конце выводим содержимое файла и удаляем переменную.
Знаю, знаю, мало примеров, ничего, я исправлюсь…
Спасибо за внимание. Автор блога