Как создать переменную в bat файле
>> Что такое enabledelayedexpansion?
Вообще я не хотел писать об этом, но т.к. в следующем примере это используется и в справке расписано туманно, напишу.
Обычно при использовании переменных в bat/cmd сценариях используется конструкция %переменная%, однако если значение переменной меняется в теле цикла и считывается там же, это может не работать. Например:
Теперь все выводится как и задумано. Замечу что переменная в данном случае обрамлена восклицательными знаками (!).
>> Создание динамических переменных в bat-файлах? Легко!
Например есть текстовый файл, нам нужно его прочитать и вывести определенные строки на экран, покажу как это сделать при помощи динамических переменных.
Далее, приступим к написанию нашего сценария:
Включаем режим расширенной обработки команд.
Объявляем вспомогательную переменную.
Собственно сама незамысловатая конструкция создания динамических переменных, с именами str1, str2, str3 и так далее.
Проверим как отработал наш сценарий.
Как видим динамические переменные использовать довольно удобно и легко, они могут помочь вам заменить массивы и добавят гибкости коду.
>> Поиск и замена текста в файлах средствами cmd/bat файла.
Приступим писать наш код, т.к. он очень похож на тот что выше, особо вдаваться в детали я не буду:
rem Собираем параметры командой строки переданной сценарию.
rem Например сценарий запущен "File_str_replace.bat greka.txt Грека Гитлер"
rem %1 = greka.txt %2=Грека %3=Гитлер
Set infile=%1
Set find=%2
Set replace=%3
REM Именно здесь происходит замена текущей строки!
copy %infile% %infile%.bak
REM Заменяем исходный файл временным
move TMP.TXT %infile%
Наш батник для поиска и замены подстрок файла готов. Теперь сгенерируем файл для него, да побольше! Сделаем это тоже батником:
@echo off
for /L %%i in (1,1,100000) do (
echo %%i.Ехал Грека через реку,Видит Грека - в реке рак.Сунул Грека в реку руку,Рак за руку Греку - цап!>>greka.txt
)
Получился файл, забитый поговоркой, размером
На сегодня пожалуй все, попозже продолжу.
CmdArcanoid "Графическая" игра, средствами командной строки Windows.
Собственно как это статично выглядит.
Секреты командной строки Windows, часть 1.
К сожалению, благодаря ряду независящих от нас причин, командная оболочка cmd.exe до сих пор не утратила своей актуальности. Многие системные администраторы используют ее для управления своими задачами, при отсутствии на OS других средств, либо в силу привычки. Несмотря свою на простоту, командная строка обладает рядом интересных и неочевидных возможностей. В этом посте я постараюсь рассказать, о некоторых недокументированных либо малоизвестных возможностях командной строки Windows.
>> Beep из bat-файла.
>> Внутренний вызов команды CALL.
Из справочной документации Microsoft мы знаем, что команда Call - совершает вызов одного пакетного файла из другого, без завершения выполнения первого файла, но мало кому известно что при помощи Call можно перемещаться по внутренним меткам того же cmd/bat файла, подобно команде Goto. @Зачем это нужно, ведь есть goto?" - спросите вы. А затем, что помимо просто перемещения по меткам команда Сall имеет две особенности :
"Умеет" возвращаться к месту своего вызова с помощью специальной метки :EOF. Умеет передававать значения в "подпрограмму". Поясню на примере:Rem Вызываем подпрогамму
rem а вот тут уже выходим см. ниже.
rem ***Начало подпрограммы.***
set /a outputval= %1*%1
echo Корень из %1 равен %outputval%.
rem не выходим, но всего лишь возвращаемся на место за вызовом
rem ***Конец подпрограммы.***
После выполнения данного командного сценария получим такой вывод:
Красиво, не правда ли? Такая незаметная возможность, может сэкономить кучу строк кода, и на время может показаться, что мы программируем на полноценном скриптовом языке.
Символы экранирования в bat-файле.
@Echo off
Echo съешь еще этих французских булок да выпей чаю ^
съешь еще этих французских булок да выпей чаю ^
съешь еще этих французских булок да выпей чаю ^
съешь еще этих французских булок да выпей чаю
Как видим все работает и экономия кода на лицо.
Выводит случайное число от 0 до 9.
У меня это число по нелепой псевдослучайности цифру секунды
%CD% - раскрывается в строку текущей директории.
%DATE% - раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME% - раскрывается в текущую дату, используя формат команды TIME.
%ERRORLEVEL% - раскрывается в текущее значение ERRORLEVEL.
Уровень ошибки, 0 - это нет ошибки, 1 - это есть ошибка, а другие это номера ошибки.
Чтобы получить полный список переменных и их значений введите команду SET
Операции со строковыми или численными переменными
Соединение 2-ух строковых переменных
Вывод определенного(ых) символа(ов) из строки
Символы номеруются начиная с 0!
Существуют 2 способа использовать переменную в переменной, например: вывод n-ого символа
Первый способ с call set
Второй способ с for и setlocal enabledelayedexpansion
писать в do
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.
Операции с числовыми переменными
Увеличивание на единицу
Деление
Деление в CMD является целочисленным!(то есть делится до целого числа)
Унарные операторы
Логическое отрицание (Logical NOT)
Унарный минус (устанавливает/сбрасывает знаковый бит)
Побитовое И (AND)
Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.
Побитовое ИЛИ (OR)
Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.
Побитовое исключающее ИЛИ (XOR)
Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на
одинаковых позициях в двоичных представлениях операндов.
Другими словами, если соответствующие биты операндов различны, то двоичный разряд результата равен 1; если же биты совпадают, то двоичный разряд результата равен 0.
К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.
Двоичный арифметический сдвиг
Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.
Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.
Максимальный размер отдельной переменной среды составляет 8192 байта.(у меня выходило только 8184, наверное это вместе с названием. )
Максимальный общий размер всех переменных среды, включая имена переменных и знак равенства, составляет 65 536 Кбайт.
Системы счисления
Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.
Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.
Восьмеричная система счисления
Но после задания значения переменной, значение хранится в десятичной системе счисления.
Например, сложение
Сохранение в переменной вывода программы
К сожаление, передача вывода программ на вход команды set не работает:
Поэтому можно воспользоваться временным сохранением в файл:
Примеры использования
Узнать динамически генерируемое имя архива WinRar:
Комментарий от Dragokas :
По сути эта команда считывает в переменную первую строку файла:
Комментарий от m00slim25 :
Эти операции, как и все остальные, поддерживают кавычный синтаксис:
Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (<)
LEQ : Меньше или равно (<=)
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.
Dragokas
Very kind Developer
Урезание части строки, замена значения в переменной:Ограничение - будет модифицирована переменная. Следует выбрать переменную, модификация которой не нарушит работу скрипта или использовать setlocal / endlocal.
Undocumented Dynamic variables (read only)
%=C:% Текуший каталог на диске C:
%=D:% Текуший каталог на диске D:,E:,F. (буковку подставите), если к нему было обращение в текущем сеансе CMD.EXE
%=ExitCode% Шестнадцатеричное значение кода возврата по EXIT /B
%=ExitCodeAscii% Символьное (ASCII) представление кода возврата по EXIT /B, если он больше 32 (пробел).
Dragokas
Very kind Developer
Полезные функции
Получить уникальное имя файла во временной папке
Мы знаем, что переменная %RANDOM% выводит значение в области от 0 до 32767,
а что если нам нужно диапазон уже, к примеру от -50 до 50? Вот решение:
Как известно в бат-файлах есть только операция целочисленного деления
и получения остатка от деления. Получить дробное число нельзя. Решил восполнить этот пробел:
Алгоритм получения дробной части:
Остаток от деления * (10^(знаков после запятой)) / делитель.
Потом убираются лишние концевые нули у дробной части.
Отличие от встроенного в CMD деления: исходное число (делимое) может превышать границу для числового типа данных CMD
(актуально для Гигабайтов данных, представленных в виде байтов, для дальнейшего перевода в более удобо-читаемую единицу измерения).
Перевод чисел из десятеричной системы в любую (2-16)
1. Простой вариант - проверка на содержимое в строке заданной подстроки
Принцип работы: если подстрока присутствует в строке, она будет удалена и результат не будет равен исходной строке.
Не работает с пустыми строками.
2. Вариант, когда подстрока тоже в переменной
Пример использования и функция:
Получение N-й строки из файла без использования (!) - DelayedExpansionTalory
Новый пользователь
Здравствуйте, не совсем понял про шестнадцатеричную систему. Мне надо день месяца, месяц и год вывести в шестьнадцатеричной системе. Как это будет выглядеть в bat?Dragokas
Very kind Developer
О какой части статьи идёт речь?
Talory
Новый пользователь
Про системы счисления. Хочу через bat файл в реестре сделать изменения в значении файла. Необходимо внести нынешнию дату в шестьнадцатеричной системеDragokas
Very kind Developer
Мне надо день месяца, месяц и год вывести в шестьнадцатеричной системе.В общем случае, перевод с 10-СС в 16 будет через Batch выглядеть так:
JAXSWAGGER
Новый пользователь
Здравствуйте, а как я могу сделать, что бы система проверяла меньше ли числовая переменная определенного числа? Я не нашел данного в статьеDragokas
Very kind Developer
IF [/I] строка1 оператор_сравнения строка2 команда
EQL - равно
NEQ - не равно
LSS - меньше
LEQ - меньше или равно
GTR - больше
GEQ - больше или равно,
JAXSWAGGER
Новый пользователь
Выдает ошибку и закрывается мгновенноIF /i A EQL 70 (echo test)
В чем моя ошибка?
Dragokas
Very kind Developer
Похоже, ошибка во встроенной документации.
Вместо EQL должно быть EQU
/i - не нужна т.к. у вас сравнение математическое, а не текстовое
Переменную нужно подавать в раскрытом виде:
Второй вариант с кавычками безопаснее, если сравниваете строки.
Переменную можно не раскрывать только в математических операциях при участии оператора set /a
m00slim25
Новый пользователь
Заметил несколько ошибок:
>> Логическое отрицание (Logical NOT)
и 0 (False) (%y%) в любых других случаях
>> Побитовая инверсия (Bitwise NOT)
>> Может неправильно инвертировать знаковый бит
>> Унарный минус (устанавливает/сбрасывает знаковый бит)
Эти операции, как и все остальные, поддерживают кавычный синтаксис:
m00slim25
Новый пользователь
Второй вариант с кавычками безопаснее, если сравниваете строки. Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (<)
LEQ : Меньше или равно (<=)
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы из скобок не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.
Dragokas
Very kind Developer
Спасибо за комментарии, дополнил.
m00slim25
Новый пользователь
При использовании нетривиальных вычислений. Например, в случае переполнения при использовании операторов битового сдвига. Эти операторы просто не определяют переполнение, вследствие чего последующая побитовая инверсия даёт ошибочный результат.
ЗЫ. Только не просите примеры, они где то далеко и глубоко закопаны Да Вы и сами можете исследовать эту особенность, это несложно
ЗЫЫ. Любой, кто использует вычисления подобного рода в командной оболочке, способен самостоятельно расследовать подобные инциденты, выявить причину ошибочных результатов, и принять меры, чтобы избежать этих инцидентов. Я привёл тот комментарий лишь для информативности: знание - сила. Можете игнорировать его, если он Вас каким-либо образом напрягает.
Dragokas
Very kind Developer
Да, верю. Я проверил побитовую инверсию на максимальных числах и у меня всё посчитало правильно.
Но если речь о битовых сдвигах, ещё и переполнении, то тогда всё понятно.
Отображает, устанавливает или удаляет переменные среды cmd.exe. Если используется без параметров, Set отображает текущие параметры переменной среды.
Для этой команды требуются расширения команд, которые включены по умолчанию.
команда set также может запускаться из консоли восстановления Windows с использованием различных параметров. дополнительные сведения см. в разделе Windows среды восстановления (WinRE).
Синтаксис
Параметры
Комментарии
Если расширения команд включены (по умолчанию) и вы запускаете Set со значением, отображаются все переменные, которые начинаются с этого значения.
Символы < ,, > , | & и ^ являются специальными символами командной оболочки и перед ними должны начинаться escape-символом ( ^ ) или заключены в кавычки <string> (например, "стрингконтаининг & symbol"). Если строка, содержащая специальный символ, заключена в кавычки, кавычки необходимо указывать как часть значения переменной среды.
используйте переменные среды для управления поведением некоторых пакетных файлов и программ, а также для управления способом отображения Windows и работы подсистемы MS-DOS. Команда Set часто используется в файле Autoexec. NT для задания переменных среды.
Если вы используете команду Set без параметров, отображаются текущие параметры среды. Эти параметры обычно включают переменные среды ComSpec и path , которые используются для поиска программ на диске. в Windows используются две другие переменные среды: PROMPT и DIRCMD.
Если заданы значения для <variable> и <string> , указанное <variable> значение добавляется в среду и <string> связывается с этой переменной. Если переменная уже существует в среде, новое строковое значение заменяет старое.
Если указать только переменную и знак равенства (без <string> ) для команды <string> , <string> значение, связанное с переменной, будет очищаться (как если бы переменная отсутствует).
При использовании параметра /a поддерживаются следующие операторы в порядке убывания приоритета.
Если используются операторы логического ( && или || ) или модуля ( % ), заключите строку выражения в кавычки. Все нечисловые строки в выражении считаются именами переменных среды, и их значения преобразуются в числа до их обработки. Если указать имя переменной среды, которое не определено в текущей среде, то выделяется нулевое значение, что позволяет выполнять арифметические операции со значениями переменных среды без использования% для получения значения.
При запуске set/a из командной строки за пределами командного скрипта отображается конечное значение выражения.
Числовые значения — это десятичные числа, кроме префикса 0 × для шестнадцатеричных чисел или 0. Таким образом, 0 × 12 совпадает с 18, что совпадает с 022.
Отложенная поддержка расширения переменных среды по умолчанию отключена, но ее можно включить или отключить с помощью команды cmd/v.
При создании пакетных файлов можно использовать команду Set для создания переменных, а затем использовать их так же, как и пронумерованные переменные %0 – %9. Можно также использовать переменные %0 – %9 в качестве входных данных для Set.
При вызове значения переменной из пакетного файла заключите значение в знаки процента ( % ). Например, если программа пакетной службы создает переменную среды с именем бод, можно использовать строку, связанную с параметром бод , в качестве заменяемого параметра, введя % бод% в командной строке.
Примеры
Чтобы задать значение Test ^ 1 для переменной среды с именем , введите:
Команда Set назначает значение переменной всем, что следует за знаком равенства (=). Поэтому при вводе set testVar=test^1 вы получите следующий результат: testVar=test^1 .
Чтобы задать значение Test 1 для переменной среды testVar , введите:
Чтобы задать переменную среды с именем include , с которой связана строка к:\директори , введите:
Затем можно использовать строку к:\директори в пакетных файлах, заключив имя в символы процента ( ). Например, можно использовать dir %include% в пакетном файле для вывода содержимого каталога, связанного с переменной среды include. После обработки этой команды строка к:\директори заменяет % include%.
Чтобы использовать команду Set в пакетной программе для добавления нового каталога в переменную среды path , введите:
Чтобы отобразить список всех переменных среды, начинающихся с буквы P, введите:
Оператор SET представляет собой расширение возможностей работы с параметрами в операционной системе. Он задает переменную, значение которой подставляется вместо ее имени при любом использовании этого имени между знаками процента. Так, если задано (переменная, которую требуют многие игры, использующие звуковую карту компьютера):
SET BLASTER=A220 I5 D1 P330
то при использовании в пакетном файле следующей конструкции:
на экран будет выведено "A220 I5 D1 P330". Переменные, определенные с помощью оператора SET называются переменными окружения среды (environment) и являются видимыми после выполнения до перезапуска DOS (если не изменять ее вручную в памяти). То есть, ее можно использовать из одного пакетного файла или программы после задания в другом. Наиболее известной является переменная PATH, представляющая собой набор путей для быстрого поиска файлов. Она задается в файле autoexec.bat.
Переменные командной строки
(параметры вызова bat-файла)
Как и в любом языке, в языке пакетных файлов возможно использование переменных, полученных в качестве параметров bat-файла.
Всего может быть 10 одновременно существующих независимых переменных. Для написания сложных программ это довольно мало, хотя для обычной работы часто хватает и 3-4. Значение переменной равно значению соответствующего параметра из командной строки. Переменная %0 будет содержать имя .bat-файла и, если вы указали, путь к нему. То есть, если вы запустили файл abc.bat со следующими параметрами:
abc.bat a bc def
то переменная %0 будет содержать значение abc.bat , %1 будет содержать значение a, %2 будет содержать bc , а %3 - def . Это свойство широко используется для создания универсальных пакетных файлов при работе с повторяющимися операциями.
Чтобы получить более чем 10 переменных из командной строки, можно воспользоваться командой SHIFT .
Команда SHIFT позволяет использовать число параметров командной строки далее 10. Однако, при этом теряются соответственно более ранние параметры. Иными словами, команда SHIFT сдвигает все значения переменных на один шаг влево. То есть, переменная %0 будет содержать значение, содержавшееся до этого в переменной %1 , а переменная %1 - значение переменной %2 до сдвига. Однако, данная операция является необратимой, то есть, невозможно сдвинуть переменные обратно.
Читайте также: