
Что такое батники и с чем их едят
Пакетный файл или в простонародье батник – это файл, который запускает командную сроку или сокращенно cmd, которая построчно интерпретирует команды, записанные в нем. Подробнее смотрите на https://ru.wikipedia.org/wiki/Пакетный_файл
.
Первая программа и основные команды
Чтобы сделать батник, нужно сначала создать текстовый файл с именем test и изменить расширение c .txt на .bat. О том, как можно это сделать, читайте здесь: https://remontka.pro/file-extensions
. У вас должен появиться файл с такой иконкой:

Нажимаем на него ПРАВОЙ
кнопкой мыши. Должно появиться диалоговое окно. Нажмем “Открыть”. Должен открыться блокнот, пишем:
@echo off
echo Hello world!
pause Для включения/отключения режима отображения вводимых команд на экране используем:
Для вывода текста на экран консоли:
Показать текущий режим отображения команд:

Вывести на экран консоли сообщение «Привет!»:


Если файл не существует, он будет создан.
При выводе служебных символов, интерпретируемых командным процессором нужно использовать символ ^. Например, если вместо значения переменной %ERRORLEVEL%, нужно вывести текст «%ERRORLEVEL%», то нужно использовать написание ^%ERRORLEVEL^%
.
<!– Put this script tag to the of your page –>
Здесь представлен фрагмент будущей книги «Основные инструменты и практики для начинающего разработчика программного обеспечения» Бальтазара Рубероля и Этьена Броду
. Книга должна помочь образованию подрастающего поколения разработчиков. Она охватит такие темы, как освоение консоли, настройка и эффективная работа в командной оболочке, управление версиями кода с помощью git
, основы SQL, инструменты вроде Make
, jq
и регулярные выражения, основы сетевого взаимодействия, а также лучшие практики разработки программного обеспечения и совместной работы. В настоящее время авторы упорно работают над этим проектом и приглашают всех поучаствовать в списке рассылки
.
– вывод на экран самих команд, а не только результат их выполнения. Так, если мы пропишем в сценарии следующую строку кода:

Для простоты запуска сценариев, пропишите в командной строке:
Path PATH;путь к папке
Вместо <путь к папке>
пропишите путь к каталогу, в котором собираетесь хранить сценарий. Дайте сценарию простое имя, например, test.bat. Теперь в переменных окружения будет прописан путь к тестируемому сценарию, и вам не придется лишний раз делать переходы по папкам.
off Hello World
Хорошо, теперь последняя строка уже не отображается, но отображается первая, что не является показателем достигнутой цели, как это исправить, я покажу дальше, по ходу статьи.

off Hello Worldd:\work\hello.txt
В данном случае, если запустить сценарий с этим кодом из консоли командной строки (cmd), то в самом окне cmd отобразится первая строка кода, а в файл hello.txt запишется строка Hello World.

Давайте перепишем предыдущий пример:
off Hello Worldd:\work\hello.txt

Или можно так прописать:
Hello Worldd:\work\hello.txt d:\work\hello.txt
По теме данной статьи можно провести аналогию с сервером сценариев Windows Script Host
, в котором объект WScript. Shell использует аналогичную команду эхо для вывода данных. Так же, если мне память не изменять, функция эхо применяется в языке программирования php. Тот, кто пробовал свои силы в различных языках программирования с легкостью сможет провести между ними аналоги и найти общие точки.
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var% Я всегда использую USEBACKQ, чтобы, если у вас есть строка для вставки или длинное имя файла, вы можете использовать свои двойные кавычки, не нажимая на команду.
Теперь, если ваш вывод будет содержать несколько строк, вы можете сделать это
SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO ( SET var!count!=%%F SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL Я нашел этот поток
о том, что там Interweb вещь. Откидывается до:
@echo off
setlocal enableextensions
for /f "tokens=*" %%a in (
'VER'
) do (
set myvar=%%a
)
echo/%%myvar%%=%myvar%
pause
endlocal Вы также можете перенаправить вывод команды во временный файл, а затем поместить содержимое этого временного файла в свою переменную, preferuchashereby:
cmd > tmpFile
set /p myvar= < tmpFile
del tmpFile Кредит на тему Tom Hardware.
в одной строке:
FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g) выход команды будет установлен в% g, затем в VAR.
Дополнительная информация: https://ss64.com/nt/for_cmd.html
set /P Variable=<File.txt Чтобы записать файл
@echo %DataToWrite%>File.txt записка; имеющий пробелы перед символом < > , вызывает добавление пробела в конце переменной, также
Чтобы добавить в файл, например программу регистрации,
Сначала создайте файл с одним ключом ввода, который называется e.txt
set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt ваш журнал будет выглядеть следующим образом
Entry1
Entry2 В любом случае пара полезных вещей
cd %windir%\system32\inetsrv
@echo off
for /F "tokens=* USEBACKQ" %%x in ( `appcmd list apppool /text:name` ) do ( echo|set /p= "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType )
echo %date% & echo %time%
pause Путем подачи команды в приглашение переменной будет вставляться результат команды “Cmd” в переменную “Var”.
Это не работает, мой плохой, script я сделал это:
SET /P Var= | dir /b *.txt
echo %Var% Надеемся на эту помощь
set a=%username%
echo %a%
set a="hello"
echo %a% Ещё вопросы
Объявление собственных переменных является неотъемлемой часть практически любого языка программирования, так в языке vbscript они объявляются с помощью ключевого слова dim
, а в jscript – используется ключевое слово var
.
Переменные командной строки Windows представляют немного другой характер, тут нельзя объявить группу переменных cmd, или же сразу присвоить значения нескольким переменным в командной строке. Давайте посмотрим на следующие строчки кода:
=D:\Work ==
В данном примере, с помощью ключевого слова cmd set
мы поэтапно объявили три переменные (Var1, Var2 и Var3), как и в языке vbscript, в cmd регистр символов не играет роли, поэтому, данные строчки выведут фразу «Привет Мир!!!»
Var3 VAR3 vAr3
Var3VAR3vAr3
Стоит учитывать один момент, запись
это не одно и тоже, то есть, в первом случае мы создаем cmd переменную «var1», а во втором – «var1 «. С присвоением значений аналогичная ситуация, так что обращайте внимание на пробел!!!
Если вы запустите на выполнение команду cmd set, которая выводит список всех переменных и их значений в текущем сеансе, то увидите, что там будут присутствовать и только что созданные cmd переменные и переменные среды
. Мы сможем обращаться к ним на протяжение всего сеанса работы.
Что бы очистить переменные в командной строке Windows от их содержимого, нужно просто присвоить пустое значение:
Мы просто после имени прописали знак равенства и все. Стоит помнить, что если в таких языках программирования как vbscript и jscript присвоение пустого значения переменной не влияет на ее существование, то в командной строке происходит полное ее удаление, то есть, команда:
просто выведет строчку %Var3%, а команда
Выведет сообщение « переменная среды var3 не определена
»
= ^ = = ^^
В данном примере мы экранировали символы & и ^, тем самым присвоив фразы:
«100 & 3 = 5»
«100 ^3»
100
«3» не является внутренней или внешней командой, исполняемой программой или командным файлом.
= ^^^ = = ^^^^
Теперь при выполнении кода:
все пройдет успешно.
Как и в сценариях сервера Windows Script Host
, переменные в командной строке Windows могут содержать заданную область видимости.
– блок кода, за пределами которого нельзя получить доступ к переменным, объявленным в нем. Довольно ясно значение области видимости проявляется при роботе с функциями, по этому вопросу можете прочить статью « Урок 3 по JScript: Объявление пользовательских функций
«.
Понятно, что переменные cmd, созданные в текущем окне командной строки недоступна для других процессов, но, есть возможность задать ограничения еще большие.

off =rem Начало локализации setlocal = Lokalnaya: = var1endlocal Globalnaya: = var1
Очень часто приходилось слышать такое от людей, которые много времени проводят за администрированием и другими IT-забавами.
Я, за не очень долгий опыт реального администрирования пришел к обратному выводу. В консоли (командной строке) В Windows можно выполнять очень много разных операций, которые стандартными возможностями не выполняются или выполняются некорректно/неудобно/долго (нужное подчеркнуть)
Совсем недавно где-то на Хабре промелькнуло высказывание из серии «Не думал, что консоль в Виндах что-то может. Хотелось бы узнать об этом побольше».
Вот так и возникло желание написать небольшую статью про основные возможности консоли.
Про самые стандартные команды консоли можно узнать тривиальным способом:
заходим в cmd и пишем:
В сообщении я не буду подробно рассматривать команды типа copy (т.е. совсем тривиальные) так как о них можно прочитать введя команду типа
1. Ввод-вывод
Рассмотреть же я попытаюсь команды, которые в основном хэлпе не написаны или описаны недостаточно подробно.
Для начала хотелось бы написать про операторы перенаправления ввода-вывода.
Таковыми операторами являются >, >>, <
.
Они нам могут пригодиться как минимум в трех ситуациях:
- Просмотр логов бат-файла
- Чтение длинных хелпов по консольным утилитам
- Подхватывание каких-либо переменных из лежащего рядом файла
При желании примеров можно придумать сколько угодно.
Из командной строки эти возможности реализуются следующим образом. Для того, чтобы перенаправить текстовые сообщения, выводимые какой-либо командой, в текстовый файл, нужно использовать конструкцию
команда > имя_файла
Если при этом заданный для вывода файл уже существовал, то он перезаписывается (старое содержимое теряется), если не существовал — создается. Можно также не создавать файл заново, а дописывать информацию, выводимую командой, в конец существующего файла. Для этого команда перенаправления вывода должна быть задана так:
команда >> имя_файла
С помощью символа < можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла:
команда < имя_файла
Приведем несколько примеров перенаправления ввода/вывода.
1. Вывод встроенной справки для команды COPY в файл copy.txt:
COPY /? > copy.txt
2. Добавление текста справки для команды XCOPY в файл copy.txt:
XCOPY /? >> copy.txt
3. Ввод новой даты из файла date.txt (DATE — это команда для просмотра и изменения системной даты):
DATE < date.txt
2. F OR… DO
2.1 Переменные
- %~I
Расширение %I, которое удаляет окружающие кавычки (“”).
- %~fI
Расширение %I до полного имени пути.
- %~dI
Замена %I именем диска.
- %~pI
Замена %I на путь.
- %~nI
Замена %I одним именем файла.
- % ~xI
Замена %I расширением имени файла.
- %~sI
Замена путем, содержащим только короткие имена.
- %~aI
Замена %I атрибутами файла.
- %~tI
Замена %I временем модификации файла.
- %~zI
Замена %I размером файла.
- %~$PATH:I
Поиск в каталогах, перечисленных в переменной среды PATH, и замена %I полным именем первого найденного файла. Если переменная среды не определена или поиск не обнаружил файлов, модификатор выдает пустую строку.
Очевидно, что с помощью такого широкого набора переменных мы можем практически полностью отвязаться от индивидуальных особенностей конкретного экземпляра операционной системы и => избежать проблем например из-за того, что система встала на диск E:, а не на C:
2.2 Работа с файлами
Данная команда производит разбор каждой строки в файле Myfile.txt, игнорируя строки, начинающиеся с точки с запятой, и передает второй и третий элементы из каждой строки в тело цикла команды FOR. Элементы разделяются запятыми и/или пробелами. Тело инструкции FOR использует %i для получения второго элемента, %j для получения третьего элемента и %k для получения оставшихся элементов в строке. Если имена файлов содержат пробелы, их следует заключать в кавычки (например, «ИмяФайла»). Для использования кавычек необходима команда usebackq. В противном случае кавычки рассматриваются как определение символьной строки для разбора.
Переменная %i объявлена явно в инструкции FOR, а %j и %k объявлены неявно с помощью tokens=. С помощью tokens= можно указать до 26 элементов, если это не вызовет попытки объявить переменную с именем, большим буквы «z» или «Z».
В данном примере перечисляются имена переменных среды в текущем окружении.
Пофантазируем?
Итак, что нам дают всего эти две команды?
в консольном режиме
Допустим, что у нас есть домен Windows и пароль доменного администратора.
Нам нужно подключиться ко всем машинам и удалить все файлы с маской *.mp3 с диска C:
Для начала — как получить список всех компьютеров сети.
Я это делаю так:
Имеем список всех компов в сети в столбик — как раз в том формате, который принимает psexec.
Правда, будут проблемы с русскими названиями компов, но это ведь не актуальная проблема, да?
Содержимое .bat — файла:
cd /d c:\
for /r %%p in (*.mp3) do del %%p
Само собой, задача чисто абстрактная. Мне просто хотелось показать, что консоль в Windows на самом деле весьма могуча и позволяет красиво и удобно решать многие задачи.
UPD.1
Спасибо большое maxshopen
за инвайт и первую карму!
Благодаря ему и всем плюсующим с радостью перенес свою первую статью в свой первый блог — Windows.
UPD.2
Спасибо, Hint
copy con file.txt
Перенаправляет вывод с клавиатуры в файл (CTRL+Z — завершение ввода).
type file.txt >prn
Печает на принтере file.txt
UPD.3
Дамы и Господа!
Осознал, что можно на эту тему еще писать и писать.
У кого-нибудь есть какие-нибудь конкретные пожелания?
Или мне самому тему придумать?
Если пожелания есть, то пишите в кАментах.
Cat
Команда cat
используется для составления списка из одного или нескольких файлов и отображения их содержимого на экране.
$ cat Documents/readme
Thanks again for reading this book!
I hope you're following so far!
$ cat Documents/computers
Computers are not intelligent
They're just fast at making dumb things.
$ cat Documents/readme Documents/computers
Thanks again for reading this book!
I hope you are following so far!
Computers are not intelligent
They're just fast at making dumb things. Параметры
- { on
| off
} - Включение или отключения режима отображения на экране информации о работе команд.
- сообщение
- Задание текста для вывода на экран.
- /?
- Отображение справки в командной строке.
wc
(word count) выводит количество символов ( -c
), слов ( -w
) или строк ( -l
) в указанном файле или потоке.
$ wc -l metadata.csv
43 metadata.csv
$ wc -w metadata.csv
405 metadata.csv
$ wc -c metadata.csv
5094 metadata.csv По умолчанию отображается всё вышеперечисленное.
$ wc metadata.csv
43 405 5094 metadata.csv Если текстовые данные передаются по конвейеру или перенаправлены в stdin
, то отображается только счётчик.
$ cat metadata.csv | wc
43 405 5094
$ cat metadata.csv | wc -l
43
$ wc -w < metadata.csv
405 Grep
grep
— это швейцарский нож фильтрации строк по заданному шаблону.
Например, можем найти все вхождения слова mutex
в файле.
$ grep mutex metadata.csv
mysql.innodb.mutex_os_waits,gauge,,event,second,The rate of mutex OS waits.,0,mysql,mutex os waits
mysql.innodb.mutex_spin_rounds,gauge,,event,second,The rate of mutex spin rounds.,0,mysql,mutex spin rounds
mysql.innodb.mutex_spin_waits,gauge,,event,second,The rate of mutex spin waits.,0,mysql,mutex spin waits grep
может обрабатывать либо файлы, указанные в качестве аргументов, либо поток текста, переданный на его stdin
. Таким образом, мы можем сцеплять несколько команд grep
для дальнейшей фильтрации текста. В следующем примере мы фильтруем строки в нашем файле metadata.csv
, чтобы найти строки, содержащие и mutex
, и OS
.
$ grep mutex metadata.csv | grep OS
mysql.innodb.mutex_os_waits,gauge,,event,second,The rate of mutex OS waits.,0,mysql,mutex os waits Рассмотрим некоторые опции grep
и их поведение.
grep -v
выполняет инвертное сопоставление: фильтрует строки, которые не
соответствуют шаблону аргументов.
$ grep -v gauge metadata.csv
metric_name,metric_type,interval,unit_name,per_unit_name,description,orientation,integration,short_name grep -i
выполняет сопоставление без учёта регистра. В следующем примере grep -i os
находит как OS
, так и os
.
$ grep -i os metadata.csv
mysql.innodb.mutex_os_waits,gauge,,event,second,The rate of mutex OS waits.,0,mysql,mutex os waits
mysql.innodb.os_log_fsyncs,gauge,,write,second,The rate of fsync writes to the log file.,0,mysql,log fsyncs grep -l
выводит список файлов, содержащих совпадение.
$ grep -l mysql metadata.csv
metadata.csv Команда grep -c
подсчитывает, сколько раз найден образец.
$ grep -c select metadata.csv
3 grep -r
рекурсивно ищет файлы в текущем рабочем каталоге и всех его подкаталогах.
$ grep -r are ~/Documents
/home/br/Documents/computers:Computers are not intelligent
/home/br/Documents/readme:I hope you are following so far! grep -w
показывает только совпадающие целиком слова.
$ grep follow ~/Documents/readme
I hope you are following so far!
$ grep -w follow ~/Documents/readme
$ Примеры
Следующий пример представляет собой пакетный файл, выводящий сообщение из трех строк на
экран с пустыми строками до и после него:
При выводе русских букв необходимо помнить о кодировке.
Текст сообщения должен быть в DOS (866) кодировке.
Многие текстовые редакторы его поддерживают.
Если необходимо, что бы текст сообщений был в WIN (1251)
кодировке и был виден из любого редактора, то можно
использовать следующий прием.
Такие сообщения для удобства можно выделить в отдельный блок.
Если такой блок неудобно располагать в начале файла, то можно
образовать из него процедуру, разместить в конце bat файла,
а на исполнение вызвать эту процедуру командой call
в начале bat файла.
Из примера все должно стать понятнее))
Если сообщение одиночное, то можно
поступить следующим образом:
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать
раздел форума
этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен
здесь
Реальные примеры
Фильтрация CSV с помощью grep и awk
$ grep -w gauge metadata.csv | awk -F, '{ if ($4 == "query") { print $1, "per", $5 } }'
mysql.performance.com_delete per second
mysql.performance.com_delete_multi per second
mysql.performance.com_insert per second
mysql.performance.com_insert_select per second
mysql.performance.com_replace_select per second
mysql.performance.com_select per second
mysql.performance.com_update per second
mysql.performance.com_update_multi per second
mysql.performance.questions per second
mysql.performance.slow_queries per second
mysql.performance.queries per second В этом примере grep
в файле metadata.csv
сначала фильтрует строки, содержащие слово gauge
, затем те, у которых query
в четвёртой колонке, и выводит название метрики (1-я колонка) с соответствующим значением per_unit_name
(5-я колонка).
Вывод адреса IPv4, связанного с сетевым интерфейсом
$ ifconfig en0 | grep inet | grep -v inet6 | awk '{ print $2 }'
192.168.0.38 Команда ifconfig <interface name>
выводит сведения по указанному сетевому интерфейсу. Например:
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 19:64:92:de:20:ba inet6 fe80::8a3:a1cb:56ae:7c7c%en0 prefixlen 64 secured scopeid 0x7 inet 192.168.0.38 netmask 0xffffff00 broadcast 192.168.0.255 nd6 options=201<PERFORMNUD,DAD> media: autoselect status: active Затем запускаем grep
для inet
, что выдаст две строки соответствия.
$ ifconfig en0 | grep inet inet6 fe80::8a3:a1cb:56ae:7c7c%en0 prefixlen 64 secured scopeid 0x7 inet 192.168.0.38 netmask 0xffffff00 broadcast 192.168.0.255 Затем с помощью grep -v
исключаем строку с ipv6
.
$ ifconfig en0 | grep inet | grep -v inet6
inet 192.168.0.38 netmask 0xffffff00 broadcast 192.168.0.255 Наконец, с помощью awk
запрашиваем второй столбец в этой строке: это IPv4-адрес, связанный с нашим сетевым интерфейсом en0
.
$ ifconfig en0 | grep inet | grep -v inet6 | awk '{ print $2 }'
192.168.0.38 Примечание. Мне предложили
заменитьgrep inet | grep -v inet6
такой надёжной командойawk
:$ ifconfig en0 | awk ' $1 == "inet" { print $2 }' 192.168.0.38Она короче и конкретно нацелена на IPv4 с условием
$1 == "inet"
.
Извлечение значения из файла конфигурации
$ grep 'editor =' ~/.gitconfig | cut -d = -f2 | sed 's/ //g'
/usr/bin/vim В файле конфигурации git текущего пользователя ищем значение editor =
, обрезаем знак =
, извлекаем второй столбец и удаляем все пробелы вокруг.
$ grep 'editor =' ~/.gitconfig editor = /usr/bin/vim
$ grep 'editor =' ~/.gitconfig | cut -d'=' -f2 /usr/bin/vim
$ grep 'editor =' ~/.gitconfig | cut -d'=' -f2 | sed 's/ //'
/usr/bin/vim Извлечение IP-адресов из файла журнала
$ grep 'Too many connections from' db.log | \ awk '{ print $12 }' | \ sed 's@/@@' | \ sort | \ uniq -c | \ sort -rn | \ head -n 10 | \ awk '{ print $2 }' 10.11.112.108 10.11.111.70 10.11.97.57 10.11.109.72 10.11.116.156 10.11.100.221 10.11.96.242 10.11.81.68 10.11.99.112 10.11.107.120 Давайте разберем, что делает этот конвейер. Во-первых, как выглядит строка в журнале.
$ grep "Too many connections from" db.log | head -n 1
2020-01-01 08:02:37,617 [myid:1] - WARN [NIOServerCxn.Factory:1.2.3.4/1.2.3.4:2181:NIOServerCnxnFactory@193] - Too many connections from /10.11.112.108 - max is 60 $ grep "Too many connections from" db.log | awk '{ print $12 }'
/10.11.112.108
... $ grep "Too many connections from" db.log | awk '{ print $12 }' | sed 's@/@@'
10.11.112.108
... Примечание. Как мы уже видели ранее, в
sed
можно использовать любой разделитель. Хотя обычно в качестве разделителя используется/
, здесь мы заменяем именно этот символ, что слегка ухудшит читаемость выражения подстановки.sed 's/\///'
$ grep 'Too many connections from' db.log | \ awk '{ print $12 }' | \ sed 's@/@@' | \ sort | \ uniq -c 1379 10.11.100.221 1213 10.11.103.168 1138 10.11.105.177 946 10.11.106.213 1211 10.11.106.4 1326 10.11.107.120 ... $ grep 'Too many connections from' db.log | \ awk '{ print $12 }' | \ sed 's@/@@' | \ sort | \ uniq -c | \ sort -rn | \ head -n 10 | \ awk '{ print $2 }' 10.11.112.108 10.11.111.70 10.11.97.57 10.11.109.72 10.11.116.156 10.11.100.221 10.11.96.242 10.11.81.68 10.11.99.112 10.11.107.120 Переименование функции в исходном файле
Представим, что мы работаем над проектом и хотели бы переименовать недачно названную функцию (или класс, переменную и т. д.) в исходном файле. Можно сделать это с помощью команды sed -i
, которая выполняет замену прямо в оригинальном файле.
$ cat izk/utils.py
def bool_from_str(s): if s.isdigit(): return int(s) == 1 return s.lower() in ['yes', 'true', 'y'] $ sed -i 's/def bool_from_str/def is_affirmative/' izk/utils.py
$ cat izk/utils.py
def is_affirmative(s): if s.isdigit(): return int(s) == 1 return s.lower() in ['yes', 'true', 'y'] Примечание. На macOS вместо
sed -i
используйтеsed -i ''
.
Однако мы переименовали функцию только в оригинальном файле. Это сломает импорт bool_from_str
в любом другом файле, поскольку эта функция больше не определена. Нужно найти способ переименовать bool_from_str
повсюду в нашем проекте. Такого можно добиться с помощью команд grep
, sed
, а также циклов for
или с помощью xargs
.
Sort
Команда sort
, собственно, сортирует данные (в указанном файле или входном потоке).
$ cat ingredients
eggs
milk
butter
tomatoes
salt
$ sort ingredients
butter
eggs
milk
salt
tomatoes sort -r
выполняет обратную сортировку.
$ sort -r ingredients
tomatoes
salt
milk
eggs
butter sort -n
сортирует поля по их арифметическому значению.
$ cat numbers
0
2
1
10
3
$ sort numbers
0
1
10
2
3
$ sort -n numbers
0
1
2
3
10 Awk
awk
— это чуть больше, чем просто инструмент обработки текста: на самом деле у него целый язык программирования
. В чём awk
действительно
хорош — так это в разбиении файлов на столбцы, и делает это с особенным блеском, когда в файлах перемешаны пробелы и табы.
$ cat -t multi-columns
John Smith Doctor^ITardis
Sarah-James Smith^I Companion^ILondon
Rose Tyler Companion^ILondon Примечание.
cat -t
отображает табы как^I
.
Как видим, столбцы разделены либо пробелами, либо табуляциями, и не всегда одинаковым количеством пробелов. cut
здесь бесполезен, потому что работает только с одним символом-разделителем. Но awk
легко разберётся с таким файлом.
$ cat multi-columns | awk '{ print $1 }'
John
Sarah-James
Rose
$ cat multi-columns | awk '{ print $3 }'
Doctor
Companion
Companion
$ cat multi-columns | awk '{ print $1,$2 }'
John Smith
Sarah-James Smith
Rose Tyler Хотя awk
способен на гораздо большее, выдача колонок составляет, наверное, 99% вариантов использования в моём личном случае.
Примечание.
{ print $NF }
выводит последний столбец в строке.
Uniq
uniq
обнаруживает и отфильтровывает соседние одинаковые строки в указанном файле или входном потоке.
$ cat duplicates
and one
and one
and two
and one
and two
and one, two, three
$ uniq duplicates
and one
and two
and one
and two
and one, two, three Поскольку uniq
отфильтровывает только соседние
строки, в наших данных могут ещё остаться дубликаты. Чтобы отфильтровать все одинаковые строки из файла, нужно сначала отсортировать его содержимое.
$ sort duplicates | uniq
and one
and one, two, three
and two uniq -c
в начале каждой строки вставляет количество её вхождений.
$ sort duplicates | uniq -c 3 and one 1 and one, two, three 2 and two uniq -u
отображает только уникальные строки.
$ sort duplicates | uniq -u
and one, two, three Примечание.
uniq
особенно полезен в сочетании с сортировкой, поскольку конвейер| sort | uniq
позволяет удалить все дублирующиеся строки в файле или потоке.
Примеры
Следующий пример представляет собой пакетный файл, выводящий сообщение из трех строк на
экран с пустыми строками до и после него:
Если вывод необходимо сделать в файл, то следует использовать
операторы перенаправления команд.
В рамках этого проекта можно ознакомиться с этим на странице
Использование операторов перенаправления команд
.
При выводе русских букв необходимо помнить о кодировке.
Текст сообщения должен быть в DOS (866) кодировке.
Многие текстовые редакторы его поддерживают.
Если необходимо, что бы текст сообщений был в WIN (1251)
кодировке и был виден из любого редактора, то можно
использовать следующий прием.
Такие сообщения для удобства можно выделить в отдельный блок.
Если такой блок неудобно располагать в начале файла, то можно
образовать из него процедуру, разместить в конце bat файла,
а на исполнение вызвать эту процедуру командой call
в начале bat файла.
Из примера все должно стать понятнее))
Если сообщение одиночное, то можно
поступить следующим образом:
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать
раздел форума
этого сайта (требуется регистрация).
Циклы for и xargs
Чтобы заменить в нашем проекте все вхождения bool_from_str
, сначала нужно рекурсивно найти их с помощью grep -r
.
$ grep -r bool_from_str .
./tests/test_utils.py:from izk.utils import bool_from_str
./tests/test_utils.py:def test_bool_from_str(s, expected):
./tests/test_utils.py: assert bool_from_str(s) == expected
./izk/utils.py:def bool_from_str(s):
./izk/prompt.py:from .utils import bool_from_str
./izk/prompt.py: default = bool_from_str(os.environ[envvar]) Поскольку нас интересуют только файлы c совпадениями, также необходимо использовать опцию -l/--files-with-matches
:
-l, --files-with-matches Only the names of files containing selected lines are written to standard out- put. grep will only search a file until a match has been found, making searches potentially less expensive. Pathnames are listed once per file searched. If the standard input is searched, the string ``(standard input)'' is written. $ grep -r --files-with-matches bool_from_str .
./tests/test_utils.py
./izk/utils.py
./izk/prompt.py Затем можем использовать команду xargs
для осуществления действий с каждой строки выходных данных (то есть всех файлов, содержащих строку bool_from_str
).
$ grep -r --files-with-matches bool_from_str . | \ xargs -n 1 sed -i 's/bool_from_str/is_affirmative/' Опция -n 1
указывает, что каждая строка в выходных данных должна выполнить отдельную команду sed
.
Затем выполняются следующие команды:
$ sed -i 's/bool_from_str/is_affirmative/' ./tests/test_utils.py
$ sed -i 's/bool_from_str/is_affirmative/' ./izk/utils.py
$ sed -i 's/bool_from_str/is_affirmative/' ./izk/prompt.py Если команда, которую вы вызываете с помощью xargs
(в нашем случае sed
), поддерживает несколько аргументов, то следует отбросить аргумент -n 1
для производительности.
grep -r --files-with-matches bool_from_str . | xargs sed -i 's/bool_from_str/is_affirmative/' Эта команда затем исполнит
$ sed -i 's/bool_from_str/is_affirmative/' ./tests/test_utils.py ./izk/utils.py ./izk/prompt.py Примечание. Из синопсиса
sed
на ман-странице видно, что команда может принять несколько аргументов.SYNOPSIS sed [-Ealn] command [file ...] sed [-Ealn] [-e command] [-f command_file] [-i extension] [file ...]Действительно, как мы видели в предыдущей главе,
file ...
означает, что принимаются несколько аргументов, представляющих собой имена файлов.
Мы видим, что произведены замены для всех вхождений bool_from_str
.
$ grep -r is_affirmative .
./tests/test_utils.py:from izk.utils import is_affirmative
./tests/test_utils.py:def test_is_affirmative(s, expected):
./tests/test_utils.py: assert is_affirmative(s) == expected
./izk/utils.py:def is_affirmative(s):
./izk/prompt.py:from .utils import is_affirmative
./izk/prompt.py: default = is_affirmative(os.environ[envvar]) Как это часто бывает, существует несколько способов достижения одного и того же результата. Вместо xargs
мы могли бы использовать циклы for
, чтобы перебирать строки по списку и выполнять действие над каждым элементом. У этих циклов такой синтаксис:
for item in list; do command $item
done Если обернуть нашу команду grep
в $()
, то оболочка выполнит её в подоболочке
, результат чего затем будет повторён в цикле for
.
$ for file in $(grep -r --files-with-matches bool_from_str .); do sed -i 's/bool_from_str/is_affirmative/' $file
done Эта команда выполнит
$ sed -i 's/bool_from_str/is_affirmative/' ./tests/test_utils.py
$ sed -i 's/bool_from_str/is_affirmative/' ./izk/utils.py
$ sed -i 's/bool_from_str/is_affirmative/' ./izk/prompt.py Синтаксис циклов for
кажется мне более чётким, чем у xargs
, однако последняя может выполнять команды параллельно, используя параметры -P n
, где n
— максимальное количество параллельных команд, выполняемых одновременно, что может дать выигрыш в производительности.
Дисклеймер
Мне 12 и я сам в этой теме плохо шарю, т.к. инфы в инете мало. Пж, без хейта.
Paste
paste
объединяет вместе два разных файла в один многоколоночный файл.
$ cat ingredients
eggs
milk
butter
tomatoes
$ cat prices
1$
1.99$
1.50$
2$/kg
$ paste ingredients prices
eggs 1$
milk 1.99$
butter 1.50$
tomatoes 2$/kg По умолчанию paste
использует разделитель табуляции, но его можно изменить с помощью параметра -d
.
$ paste ingredients prices -d:
eggs:1$
milk:1.99$
butter:1.50$
tomatoes:2$/kg Ещё один распространённый способ использования paste
— объединение всех строк в потоке или файле с помощью заданного разделителя, используя комбинацию аргументов -s
и -d
.
$ paste -s -d, ingredients
eggs,milk,butter,tomatoes Если в качестве входного файла указан параметр -
, то вместо него будет считываться stdin
.
$ cat ingredients | paste -s -d, -
eggs,milk,butter,tomatoes Метки
Создадите файл start.bat в той же папке, где и test.bat, напишите в нем:
test.bat 2 2 Мы запустили батник, НО подали в него аргументы 2 и 2. Чтобы к ним обратиться, нужно написать %n, где “n” – номер аргумента, считая от одного(не от нуля), вот код, считающий сумму первого и второго аргумента (их может быть от нуля до 9-и):
@echo off
set /a res=%1+%2
echo res
pause Метка – это именованное место в коде, она создается с помощью команды “:name”
А этот переходит на метку :m и продолжает выполнение, начиная с нее
rem куча кода
:m
rem куча кода
goto m
rem куча кода И в завершение статьи, хочу сказать о команде call. Она превращает в последующей команде “%%” в “%”, а переменные – на их значения. Пример использования:
call echo %%str:~%a%,%b%%% Резюме
Все эти инструменты открывают целый мир возможностей, так как позволяют извлекать и преобразовывать данные, создавая целые конвейеры из команд, которые, возможно, никогда не предназначались для совместной работы. Каждая из них выполняет относительно небольшую функцию (сортировка sort
, объединение cat
, фильтры grep
, редактирование sed
, вырезание cut
и т. д.).
Любую задачу, включающую текст, можно свести к конвейеру более мелких задач, каждая из которых выполняет простое действие и передаёт свои выходные данные в следующую задачу.
-
grep
строк, которые соответствуют шаблону строк с IP-адресами - найти столбец с IP-адресом, извлечь его с помощью
awk - отсортировать список IP-адресов с помощью
sort - устранить смежные дубликаты с помощью
uniq - подсчитать количество строк (то есть уникальных IP-адресов) с помощью
wc -l
Поскольку есть множество нативных и сторонних инструментов обработки текста, также много способов решить любую задачу.
Примеры в этой статье были надуманными, но я предлагаю вам прочитать удивительную статью $ grep -r bool_from_str . «Инструменты командной строки могут быть в 235 раз быстрее, чем ваш кластер Hadoop»
./tests/test_utils.py:from izk.utils import bool_from_str
./tests/test_utils.py:def test_bool_from_str(s, expected):
./tests/test_utils.py: assert bool_from_str(s) == expected
./izk/utils.py:def bool_from_str(s):
./izk/prompt.py:from .utils import bool_from_str
./izk/prompt.py: default = bool_from_str(os.environ[envvar])-l/--files-with-matches
, чтобы получить представление о том, насколько полезны и мощны эти команды на самом деле и какие реальные проблемы они могут решить. xargs
Sed
-l, --files-with-matches
Only the names of files containing selected lines are written to standard out-
put. grep will only search a file until a match has been found, making
searches potentially less expensive. Pathnames are listed once per file
searched. If the standard input is searched, the string ``(standard input)''
is written.
— это неинтерактивный потоковый редактор, который используется для преобразования текста во входном потоке строка за строкой. В качестве входных данных используется или файл, или
, а на выходе тоже или файл, или $ grep -r --files-with-matches bool_from_str .
./tests/test_utils.py
./izk/utils.py
./izk/prompt.py
.
Команды редактора могут включать один или несколько bool_from_str адресов
,
функцию $ grep -r --files-with-matches bool_from_str . | \
xargs -n 1 sed -i 's/bool_from_str/is_affirmative/'
и
параметры
. Таким образом, команды выглядят следующим образом:
bool_from_str
grep -r Хотя
выполняет множество функций, мы рассмотрим только замену текста как один из самых распространённых вариантов использования.
Замена текста
Команда замены sed
выглядит следующим образом:
s/PATTERN/REPLACEMENT/[options] Пример
: замена первого экземпляра слова в каждой строке в файле:
$ cat hello
hello hello
hello world!
hi
$ cat hello | sed 's/hello/Hey I just met you/'
Hey I just met you hello
Hey I just met you world
hi Мы видим, что в первой строчке заменяется только первый экземпляр hello
. Чтобы заменить все
вхождения hello
во всех строках, можно использовать опцию g
(означает global
).
$ cat hello | sed 's/hello/Hey I just met you/g'
Hey I just met you Hey I just met you
Hey I just met you world
hi sed
позволяет использовать любые разделители, кроме /
, что особенно улучшает читаемость, если в самих аргументах команды есть слэши.
$ cat hello | sed 's@hello@Hey I just met you@g'
Hey I just met you Hey I just met you
Hey I just met you world
hi Адрес говорит редактору, в какой строке или диапазоне строк выполнять подстановку.
$ cat hello | sed '1s/hello/Hey I just met you/g'
Hey I just met you hello
hello world
hi
$ cat hello | sed '2s/hello/Hey I just met you/g'
hello hello
Hey I just met you world
hi Адрес 1
указывает заменять hello
на Hey I just met you
в первой строке. Можем указать диапазон адресов в нотации <start>,<end>
, где <end>
может быть либо номером строки, либо $
, то есть последней строкой в файле.
$ cat hello | sed '1,2s/hello/Hey I just met you/g'
Hey I just met you Hey I just met you
Hey I just met you world
hi
$ cat hello | sed '2,3s/hello/Hey I just met you/g'
hello hello
Hey I just met you world
hi
$ cat hello | sed '2,$s/hello/Hey I just met you/g'
hello hello
Hey I just met you world
hi По умолчанию sed
выдаёт результат в свой stdout
, но может отредактировать и оригинальный файл с опцией -i
.
$ sed -i '' 's/hello/Bonjour/' sed-data
$ cat sed-data
Bonjour hello
Bonjour world
hi Примечание. В Linux достаточно только
-i
. Но в macOS поведение команды немного отличается, поэтому сразу после-i
нужно добавить''
.
Cut
cut
извлекает часть файла (или, как обычно, входного потока). Команда определяет разделитель полей (который разделяет столбцы) с помощью опции -d
, а порядковые номера столбцов для извлечения с помощью опции -f
.
Например, следующая команда извлекает первый столбец из последних пяти строк нашего CSV-файла.
$ tail -n 5 metadata.csv | cut -d , -f 1
mysql.performance.user_time
mysql.replication.seconds_behind_master
mysql.replication.slave_running
mysql.replication.slaves_connected
mysql.performance.queries Поскольку мы имеем дело с CSV, то столбцы разделяются запятой, а за извлечение первого столбца отвечает опция -f 1
.
Можно выбрать и первый, и второй столбцы, используя опцию -f 1,2
.
$ tail -n 5 metadata.csv | cut -d , -f 1,2
mysql.performance.user_time,gauge
mysql.replication.seconds_behind_master,gauge
mysql.replication.slave_running,gauge
mysql.replication.slaves_connected,gauge
mysql.performance.queries,gauge Наводим красоту

не делает ничего и служит комментарием к коду
rem Это самая лучшая прога в мире!!!!! Код включает русские символы и другие из ascii(например: “╬▓☼”, можно скопировать с http://pascalguru.ru/psevdograf.html
), иначе ascii символы превратятся в кракозябры:
chcp 65001 Следующий код код работает, как команда “pause”, но ничего не выводит на экран и не реагирует на нажатие клавиш(я потом объясню, как это работает).
:m
goto m А этот – меняет заголовок окна на “name”

title name Эта команда меняет цвет фона и текста, вместо a и b можно поставить любые шестнадцатеричные цифры(команда не сработает если a = b) см. таблицу ниже. Запись c одной буквой “а” аналогично записи “0a”
color ab Таблица
$ grep -r bool_from_str .
./tests/test_utils.py:from izk.utils import bool_from_str
./tests/test_utils.py:def test_bool_from_str(s, expected):
./tests/test_utils.py: assert bool_from_str(s) == expected
./izk/utils.py:def bool_from_str(s):
./izk/prompt.py:from .utils import bool_from_str
./izk/prompt.py: default = bool_from_str(os.environ[envvar])
Эта – досрочно завершает программу bool_from_str
grep -r
Примеры
-l/--files-with-matchesСледующий пример представляет собой пакетный файл, выводящий сообщение из трех строк на экран с пустыми строками до и после него:$ grep -r --files-with-matches bool_from_str . ./tests/test_utils.py ./izk/utils.py ./izk/prompt.pyПри выводе русских букв необходимо помнить о кодировке. Текст сообщения должен быть в DOS кодировке. Многие текстовые редакторы его поддерживают.
Если необходимо, что бы текст сообщений был в WIN (1251) кодировке и был виден из любого редактора, то можно использовать следующий прием.
-l, --files-with-matches Only the names of files containing selected lines are written to standard out- put. grep will only search a file until a match has been found, making searches potentially less expensive. Pathnames are listed once per file searched. If the standard input is searched, the string ``(standard input)'' is written.Такие сообщения для удобства можно выделить в отдельный блок.
Если такой блок неудобно располагать в начале файла, то можно образовать из него процедуру, разместить в конце bat файла, а на исполнение вызвать эту процедуру командойgrep -lcall в начале bat файла. Из примера все должно стать понятнее))xargsЕсли сообщение одиночное, то можно поступить следующим образом:bool_from_strЧто дальше
- Подсчитайте количество файлов и каталогов, расположенных в вашем домашнем каталоге.
$ grep -r --files-with-matches bool_from_str . | \
xargs -n 1 sed -i 's/bool_from_str/is_affirmative/'- Отобразите содержимое файла только прописными буквами.
- Подсчитайте, сколько раз встречалось каждое слово в файле.
Подсчитайте количество гласных в файле. Отсортируйте результат от наиболее распространённой до наименее распространённой буквы.
Будущая книга «Основные инструменты и практики для начинающего разработчика программного обеспечения» (Essential Tools and Practices for the Aspiring Software Developer) Бальтазара Рубероля и Этьена Броду
поможет создать продуктивную среду разработки и познакомиться с полезными инструментами и практиками, которые нужны для профессионального роста. Как уже было сказано, она охватит такие темы, как освоение терминала, настройка и эффективная работа в командной оболочке, управление версиями кода с помощьюgit
, основы SQL, инструменты вродеMake
,jq
и регулярные выражения, основы сетевого взаимодействия, а также лучшие практики разработки программного обеспечения и совместной работы.Обработка текста в командной оболочке
Одна из причин, которые делают командную оболочку бесценным инструментом, — это большое количество команд обработки текста и возможность легко объединять их в конвейер, создавая сложные шаблоны обработки. Эти команды делают тривиальными многие задачи по анализу текста и данных, преобразованию данных между разными форматами, по фильтрации строк и т. д.
При работе с текстовыми данными главный принцип заключается в том, чтобы разбить любую сложную проблему на множество более мелких — и решить каждую из них с помощью специализированного инструмента.
Заставьте каждую программу хорошо выполнять одну функцию — «Основы философии Unix»
Примеры из этой главы на первый взгляд могут показаться немного надуманными, но это сделано специально. Каждый из инструментов разработан для решения одной небольшой задачи. Однако в сочетании они становятся чрезвычайно мощными.
Мы рассмотрим некоторые из наиболее распространенных и полезных команд обработки текста в командной оболочке и продемонстрируем реальные рабочие процессы, соединяющие их вместе. Я предлагаю взглянуть на маны этих команд, чтобы увидеть всю широту возможностей в вашем распоряжении.
Файл CSV с примерами доступен в онлайне
. Можете скачать его для проверки материала.Fold
Команда
fold
сворачивает все входные строки до заданной ширины. Например, может быть полезно убедиться, что текст помещается на дисплеях небольшого размера. Так,fold -w n
укладывает строки по ширине n символов.$ cat ~/Documents/readme | fold -w 16 Thanks again for reading this bo ok! I hope you're fo llowing so far!Команда
fold -s
будет разбивать строки только на символах пробела. Её можно объединить с предыдущей, чтобы ограничить строким заданным количеством символом.Thanks again for reading this book! I hope you're following so far!Tail
tail
— аналогhead
, только он выводит последние n строк в файле.$ tail -n 1 metadata.csv mysql.performance.queries,gauge,,query,second,The rate of queries.,0,mysql,queriesЕсли хотите вывести все строки, расположенном после n-й строки (включая её), можете использовать аргумент
-n +n
.$ tail -n +42 metadata.csv mysql.replication.slaves_connected,gauge,,,,Number of slaves connected to a replication master.,0,mysql,slaves connected mysql.performance.queries,gauge,,query,second,The rate of queries.,0,mysql,queriesВ нашем файле 43 строки, поэтому
tail -n +42
выводит только 42-ю и 43-ю строки из него.Если параметр
-n
не указан,tail
выведет последние десять строк в указанном файле или входном потоке.Head
head
выводит первые n строк в файле. Это может быть очень полезно для того, чтобы заглянуть в файл неизвестной структуры и формата, не заваливая всю консоль кучей текста.$ head -n 2 metadata.csv metric_name,metric_type,interval,unit_name,per_unit_name,description,orientation,integration,short_name mysql.galera.wsrep_cluster_size,gauge,,node,,The current number of nodes in the Galera cluster.,0,mysql,galera cluster sizeЕсли
-n
не указано,head
выводит первые десять строк указанного файла или входящего потока.Циклы и условия
Цикл можно создать с помощью команды "for", синтаксис следующий:
for %%i in (a b c) do ( cmd )for %%i in (a b c) do cmd(a b c) это список (не обязательно из 3-х элементов) и переменная %%i (нужно ставить символ после процентов, а не между) по очереди проходит по значениям в списке
Если добавить флаг "/l", то переменная в первый раз будет равна "a". К ней каждый раз будет прибавляться "b", пока она не станет больше "c"(тут размер ДОЛЖЕН
равняться 3)запустите этот код, тут все наглядно
@echo off chcp 65001 echo Начало for /l %%i in (1 1 10) do echo %%i echo Конец pauseКоманда if выполняет код, если условие верно (или если поставить not после if, когда НЕ
верно), вот операторы сравнения:P. S. строки нужно брать в кавычки "%str%"=="Hello"
@echo off set /p a=Enter number if a gtr 0 echo positive else\ if a equ 0 echo 0 else echo negative pauseв 3-ей строке, если "a" > 0 выводиться "положительный"(на английском 🙂 ), если равен - 0,в 4-ой если меньше - "отрицательный"
символ "\" означает, что команда продолжается на следующей строке
Параметры
- { on
| off
} - Включение или отключения режима отображения на экране информации о работе команд.
- сообщение
- Задание текста для вывода на экран.
- /?
- Отображение справки в командной строке.
tr
расшифровывается как translate
. Эта команда заменяет одни символы на другие. Она работает либо с символами, либо с классами
символов, такими как строчные, печатные, пробелы, буквенно-цифровые и т. д.
На стандартных входных данных tr <char1> <char2>
заменяет все вхождения <char1> на <char2>
$ echo "Computers are fast" | tr a A
computers Are fAst $ echo "computers are fast" | tr '[:space:]' ','
computers,are,fast,% Все символы, похожие на пробелы, переведены в запятую. Обратите внимание, что символ %
в конце выдачи означает отсутствие завершающей новой строки. Действительно, этот символ тоже переведён в запятую.
$ echo "computers are fast" | tr '[:lower:]' '[:upper:]'
COMPUTERS ARE FAST
$ echo "COMPUTERS ARE FAST" | tr '[:upper:]' '[:lower:]'
computers are fast tr -c SET1 SET2
преобразует любой символ, не
входящий в набор SET1, в символы набора SET2. В следующем примере все символы, кроме указанных гласных, заменяются пробелами.
$ echo "computers are fast" | tr -c '[aeiouy]' ' ' o u e a e a tr -d
удаляет указанные символы, а не заменяет их. Это эквивалент tr <char> ''
.
$ echo "Computers Are Fast" | tr -d '[:lower:]'
C A F tr
также может заменить диапазоны символов, например, все буквы между a
и e
или все числа между 1 и 8, используя нотацию s-e
, где s
— начальный символ, а e
— конечный.
$ echo "computers are fast" | tr 'a-e' 'x'
xomputxrs xrx fxst
$ echo "5uch l337 5p34k" | tr '1-4' 'x'
5uch lxx7 5pxxk Команда tr -s string1
сжимает все множественные вхождения символов в string1
в одно-единственное. Одним из наиболее полезных применений tr -s
является замена нескольких последовательных пробелов одним.
$ echo "Computers are fast" | tr -s ' '
Computers are fast Переменные
Создать переменную можно с помощью команды set, синтаксис объявления следующий: P. S. это не совсем переменные, это скорее макросы (для тех к кто не знает C/C++ это именованный кусочек кода, имя которого заменяется на этот кусочек кода)
set a=Hello world Если после "set" добавить флаг "/a" то:
Переменной задастся значение выражения, а не его текст, например:
set a=2+2 > 2+2 set /a a=2+2 > 4Переменной можно присвоить ТОЛЬКО числовое значение
Чтобы обратиться к переменной, нужно окружить ее символами "%" (так %name%), пример кода:
set /a a=%b%+%b%
echo %a% Параметры
- { on
| off
} - Включение или отключения режима отображения на экране информации о работе команд.
- сообщение
- Задание текста для вывода на экран.
- /?
- Отображение справки в командной строке.
Подробнее о переменных
Если добавить флаг "/p", то выводиться значение после символа "=", а переменной задается введенное значение(запустите этот код:)
@echo off
set /p a=Enter str
echo %a%
pause следующий код вырезает строку от символа номер "a" до символа номер "b" НЕ включительно(счет идет с нуля, отрицательные числа - счет с конца от единицы). Если аргумент один, то он присваивается числу "b", а "a" = 0
%str:~a,b% следующий заменяет подстроки "a" в строке на строки "b":
%str:a=b%




