Блог о системном администрировании. Bat файл переменные


Переменные в CMD, команда SET и арифметика

Переменные. Команда SET​

Задание переменных

Вручную

Ввод с клавиатуры

CMD/BATCH:

set /p x="BBeduTe cTpoky: " Типы переменных

Тип строка

Ограничение 8184 символа. Тип числоОграничение от -2147483647 до 2147483647.

Использование переменных

Вывод значения переменных

Существующие переменные

%RANDOM% - раскрывается в случайное десятичное число между 0 и 32767.(от 0 до (2^17)-1)

CMD/BATCH:

set /a random10=%random%/3277 Выводит случайное число от 0 до 9. У меня это число по нелепой псевдослучайности цифру секунды%CD% - раскрывается в строку текущей директории.%DATE% - раскрывается в текущую дату, используя тот же формат команды DATE.%TIME% - раскрывается в текущую дату, используя формат команды TIME.%ERRORLEVEL% - раскрывается в текущее значение ERRORLEVEL. Уровень ошибки, 0 - это нет ошибки, 1 - это есть ошибка, а другие это номера ошибки.

Чтобы получить полный список переменных и их значений введите команду SET

Операции со строковыми или численными переменными

Соединение 2-ух строковых переменных

CMD/BATCH:

set x=Gaz set y=Prom echo %x%%y% (GazProm) Вывод определенного(ых) символа(ов) из строкиСимволы номеруются начиная с 0!Вывод 1-ого символаВывод 3-х символов с конца строкиВывод всей строки кроме 2-ух первых символовВывод всей строки кроме 2-ух последних символовВывод 3-х символов начиная с 3Удаление подстроки из строки

CMD/BATCH:

set str=babywka echo %str:ba=% (bywka) Замена подстроки из строки на другую подстроку

CMD/BATCH:

set str=babywka echo %str:bab=xlop% (xlopywka) Удаление кавычек(") из строки

CMD/BATCH:

set str2="qwerty" echo %str2:"=% (qwert) В данном случае: если кавычки в начале и конце строки - можно юзать

CMD/BATCH:

echo %str2:~1,-1% (qwert) Существуют 2 способа использовать переменную в переменной, например: вывод n-ого символа

Первый способ с call set

CMD/BATCH:

call set x=%%str:~%n%,1%% echo %x% Второй способ с for и setlocal enabledelayedexpansion

CMD/BATCH:

setlocal enabledelayedexpansion for /l %%i in (%n%,1,%n%) do (set x=!str:~%%i,1!) echo %x% тут неважно что в for писать, главное писать в do С циклами мы разберемся в следующей статье. Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.

Операции с числовыми переменными

Увеличивание на единицу

Увеличивание в 2 разааналогичноВозведение в квадратВозведение в кубДелениеДеление в CMD является целочисленным!(то есть делится до целого числа)

CMD/BATCH:

set /a x=15 set /a y=4 set /a xy=%x%/%y% (3) Сложение

CMD/BATCH:

set /a x=5 set /a y=-6 set /a xy=%x%+%y% (5+(-6)=5-6=-1) Вычитание

CMD/BATCH:

set /a x=5 set /a y=-6 set /a xy=%x%-%y% (5-(-6)=5+6=11) Вычисление остаткаУнарные операторы(Не знаю, как они называются)дает результат(%y%) 1, если переменная(%x%) равна 0, и 0 (%y%) в любых других случаях

CMD/BATCH:

Например set /a x=5 set /a y="!"%x% (0) set /a x=0 set /a y="!"%x% (1) дает результат -1-%x% (%y%) Например

CMD/BATCH:

set /a x=5 set /a y="~"%x% (-1-5=-(1+5)= -6) set /a x=-3 set /a y="~"%x% (-1-(-3)=-1+3=3-1= 2) Отрицаниедает результат 0-%x% (%y%) Например

CMD/BATCH:

set /a x=5 set /a y="-"%x% (-5) set /a x=-3 set /a y="-"%x% (3) Двоичные операторы

CMD/BATCH:

set x=3 (в двоичной системе счисления - 0011) set y=5 (в двоичной системе счисления - 0101) Побитовое И (AND)

Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.

CMD/BATCH:

set /a xy=%x%"&"%y% (1, в двоичной системе счисления - 0001) Побитовое ИЛИ (OR)

Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.

CMD/BATCH:

set /a xy=%x%"|"%y% (7, в двоичной системе счисления - 0111) Побитовое исключающее ИЛИ (XOR)

Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на

одинаковых позициях в двоичных представлениях операндов.Другими словами, если соответствующие биты операндов различны, то двоичный разряд результата равен 1; если же биты совпадают, то двоичный разряд результата равен 0.

CMD/BATCH:

set /a xy=%x%"^"%y% (6, в двоичной системе счисления - 0110) К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига. Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему). При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.

Двоичный арифметический сдвиг

Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.

Вправо

CMD/BATCH:

set /a xy=%x%">>"1 (1, в двоичной системе счисления - 0011->0001) set /a xy2=%y%">>"1 (2, в двоичной системе счисления - 0101->0010) set /a n=13 (в двоичной системе счисления - 1101) set /a xn=%n%">>"2 (3, в двоичной системе счисления - 1101->0011) set /a my=-%y%">>"1 (-3, в двоичной системе счисления - 1011(-5)->1101(-3)) Влево

CMD/BATCH:

set /a xy=%x%"<<"1 (6, в двоичной системе счисления - 0011->0110) set /a xy2=%y%"<<"1 (10, в двоичной системе счисления - 0101->1010) set /a xy3=%y%"<<"4 (80, в двоичной системе счисления - 0101->1010000) set /a my=-%y%"<<"1 (-10, в двоичной системе счисления - 1011(-5)->10110(-10)) Максимальный размер отдельной переменной среды составляет 8192 байта.(у меня выходило только 8184, наверное это вместе с названием...) Максимальный общий размер всех переменных среды, включая имена переменных и знак равенства, составляет 65 536 Кбайт.

И я забыл, про 8-ричную и 16-ричную систему счисления в CMD

Системы счисления

Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.

Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.

Восьмеричная система счисления

CMD/BATCH:

set /a x=022 (Это 22 в восьмеричной системе счисления, и 18 в десятичной) Можно производить все операции, также как и с десятеричными числами. Но после задания значения переменной, значение хранится в десятичной системе счисления. Например, сложение

CMD/BATCH:

set /a xy=022+07 (Это 22+7=31 в восьмеричной системе счисления, и 31 в десятичной) Шестнадцатеричная система счисления

CMD/BATCH:

set /a x=0x3A (Это 3A в восьмеричной системе счисления, и 58 в десятичной) Вычитание

CMD/BATCH:

set /a xy=0x3A-0x66 (Это 3A-66=-54 в восьмеричной системе счисления, и -44 в десятичной) Сохранение в переменной вывода программы К сожаление, передача вывода программ на вход команды set не работает:

CMD/BATCH:

echo 1|set /p AA="" set AA Поэтому можно воспользоваться временным сохранением в файл:

CMD/BATCH:

echo 1> 0.tmp set /p AA="" <0.tmp del 0.tmp echo %AA% Примеры использования Узнать динамически генерируемое имя архива WinRar:

CMD/BATCH:

rar a -z%Comment% -p%p% "-ag yyyy-mm-dd[n]" %OutPath%\%arhivename%.%ext% @%FileList% >rar.log.tmp for /f "tokens=2*" %%I in ('find /i "Creating archive" ^<rar.log.tmp') do @echo %%J >rarfilename.tmp set /p rarfilename="" <rarfilename.tmp del rarfilename.tmp Узнать имя последнего изменённого файла в папке:

CMD/BATCH:

dir /b /a-d /o-d *.* >%temp%\0.tmp set /p lastfile="" <%temp%\0.tmp del %temp%\0.tmp echo "%lastfile%" Комментарий от Dragokas : По сути эта команда считывает в переменную первую строку файла:

safezone.cc

Урок 3 по CMD - работа с переменными

Объявление собственных переменных является неотъемлемой часть практически любого языка программирования, так в языке vbscript они объявляются с помощью ключевого слова dim, а в jscript – используется ключевое слово var.

Переменные командной строки Windows представляют немного другой характер, тут нельзя объявить группу переменных cmd, или же сразу присвоить значения нескольким переменным в командной строке. Давайте посмотрим на следующие строчки кода:

set Var1=D:\Work set Var2=100 set Var3="Привет Мир!!!"

В данном примере, с помощью ключевого слова cmd set мы поэтапно объявили три переменные (Var1, Var2 и Var3), как и в языке vbscript, в cmd регистр символов не играет роли, поэтому, данные строчки выведут фразу "Привет Мир!!!"

set Var3 set VAR3 set vAr3

или

echo %Var3% echo %VAR3% echo %vAr3%

Стоит учитывать один момент, запись

и

это не одно и тоже, то есть, в первом случае мы создаем cmd переменную "var1", а во втором – "var1 ". С присвоением значений аналогичная ситуация, так что обращайте внимание на пробел!!!

Видим, что бы вывести значение переменной с помощью функции Echo, мы заключаем ее в символ "%", для set – просто прописываем ее имя, так же стоит учитывать, что всем переменным присваивается строковой тип.

Если вы запустите на выполнение команду cmd set, которая выводит список всех переменных и их значений в текущем сеансе, то увидите, что там будут присутствовать и только что созданные cmd переменные и переменные среды. Мы сможем обращаться к ним на протяжение всего сеанса работы.

Что бы очистить переменные в командной строке Windows от их содержимого, нужно просто присвоить пустое значение:

Мы просто после имени прописали знак равенства и все. Стоит помнить, что если в таких языках программирования как vbscript и jscript присвоение пустого значения переменной не влияет на ее существование, то в командной строке происходит полное ее удаление, то есть, команда:

просто выведет строчку %Var3%, а команда

Выведет сообщение "переменная среды var3 не определена"

Стоит учитывать тот момент, что если мы хотим, что бы переменная командной строки Windows содержала специальные символы (например, @ < > & | ^ ), то их нужно экранировать.  В языке jscript для вывода специальных символов используются esc-последовательности, в командной строке специальный символ экранируется с помощью "^":

set Var4=100 ^& 3 = 5 set Var5=100 ^^3

В данном примере мы экранировали символы & и ^, тем самым присвоив фразы:

"100 & 3 = 5""100 ^3"

Стоит обратить внимание, что если мы попытаемся вывести значения данных переменных с помощью функции cmd set, то проблем не возникнет, но если будет использовать функцию echo, то получим совсем не тот результат, что ожидали. Так, при попытке выполнить следующую команду:

Получим предупреждение:

100"3" не является внутренней или внешней командой, исполняемой программой или командным файлом.

Это происходит из-за повторного анализа спец-символов при использовании функции echo. Надо просто прописать символ "^" экранирования не один раз, а трижды:

set Var4=100 ^^^& 3 = 5 set Var5=100 ^^^^3

Теперь при выполнении кода:

все пройдет успешно.

Как и в сценариях сервера Windows Script Host, переменные в командной строке Windows могут содержать заданную область видимости.

Область видимости – блок кода, за пределами которого нельзя получить доступ к переменным, объявленным в нем. Довольно ясно значение области видимости проявляется при роботе с функциями, по этому вопросу можете прочить статью "Урок 3 по JScript: Объявление пользовательских функций".

Понятно, что переменные cmd, созданные в текущем окне командной строки недоступна для других процессов, но, есть возможность задать ограничения еще большие.

Что бы задать локальную область видимости, используется блок SETLOCAL … ENDLOCAL. Все cmd переменные командной строки Windows, объявленные в середине данного блока не будут видны за его пределами. Откройте редактор (я использую редактор Notepad++, так как он сразу подсвечивает код), и пропишите в нем следующие строчки кода:

@echo off set var1=0 rem Начало локализации setlocal set var1=5 echo Lokalnaya: var1= %var1% endlocal   echo Globalnaya: var1= %var1%

Видим, что вначале мы объявили var1 и присвоили ей значение 0, далее мы снова объявили переменную с аналогичным именем, но уже в блоке SETLOCAL … ENDLOCAL. В сценарии происходит вывод значения как локальной, так и глобальной var1. Я специально использовал латинские знаки, что бы у вас в случае чего не выводились крякозябры.

scriptcoding.ru

Блог о системном администрировании.: ноября 2009

В продолжении темы Cmd – хаков, опишу еще несколько эффективных приемов работы с командной строкой.

>> Что такое 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), но мы не ищем легких путей это будет не совсем чисто, т.к. в нужный момент этого всего может не оказаться под рукой.

Возможна ли реализация данной функции на cmd ? Конечно! А поможет нам в этом специальные строки расширения, а точнее конструкция  вида %переменная:A=B%, где переменная- переменная содержащая исходную подстроку, A – подстрока которую ищем, B – подстрока на которую меняем искомую подстроку в строке.

Приступим писать наш код, т.к. он очень похож на тот что выше, особо вдаваться в детали я не буду:

@echo off

setlocal enabledelayedexpansion

rem Собираем параметры командой строки переданной сценарию. rem Например сценарий запущен "File_str_replace.bat greka.txt Грека Гитлер" rem %1 = greka.txt %2=Грека %3=Гитлер Set infile=%1 Set find=%2 Set replace=%3

    @echo off

    setlocal enabledelayedexpansion

    set COUNT=0

    for /F "tokens=* delims=," %%n in (!infile!) do (     set LINE=%%n

    set TMPR=!LINE:%find%=%replace%!

REM Именно здесь происходит замена текущей строки!

    Echo !TMPR!>>TMP.TXT

REM Добавляем строку к временному файлу                     )

REM Делаем резервное копирование исходного файла, на случай что что то пойдет не так…

copy %infile% %infile%.bak

REM Заменяем исходный файл временным

move TMP.TXT %infile%

Наш батник для поиска и замены подстрок файла готов. Теперь сгенерируем файл для него, да побольше! Сделаем это тоже батником:

@echo off for /L %%i in (1,1,100000) do (

echo %%i.Ехал Грека через реку,Видит Грека - в реке рак.Сунул Грека в реку руку,Рак за руку Греку - цап!>>greka.txt )

Получился файл, забитый поговоркой, размером ~ 10 мегабайт, неплохо для примера…  Запустим Наш сценарий введя в командной строке “File_str_replace.bat greka.txt Грека Гитлер” , для того чтобы заменить все слова Грека на Гитлер. Запустив увидим что через полторы минуты(неплохо для 20-ти летнего консольного мамонта) в нашем файле поговорка заменилась на “Ехал Гитлер через реку,Видит Гитлер - в реке рак.Сунул Гитлер в реку руку,Рак за руку Греку - цап”. Можно усовершенствовать сценарий, и даже прикрутить к ней регулярные выражения, но это уже мелкие технические детали :)

На сегодня пожалуй все, попозже продолжу.

admin-scripting.blogspot.com

Кодировка значения переменной в bat-файле

Вопрос: Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*

Эта тема - ответвление

Постим сюда детали, которые Вы получили опытным путем.Которые считаете уникальными, или могут быть полезными при наборе кода BAT файлов, лучшего понимания принципов работы среды командной строки.Пишем ошибки, которые иногда допускаете, а потом ломаете голову, почему не работает

Писать можно много и часто, даже если это мелочь. Все соберем вместе. Весомые замечания перенесем в указанную выше тему.

Собрано по категориям:

Файловые операции5) Использование рабочего каталога Bat файла в роле начального для выполнения команд в нем на ОС >= Vista 8) Как проверить - существует ли папка 10) Не использовать && после команды Del. 12) После перехода в другой каталог проверять успех операции 18) Листинг текущего каталога или корневого 24) Работа с файлами/папками, в именах которых есть буквы украинского алфавита.

Символы1) Экранирование спецсимвола 13) Сохранение концевого пробела в переменную 17) Запятая и точка с запятой - разделители аргументов 30) Экранирование номера потока в перенаправлении вывода Echo

Переменные2) Использование одноименных переменных без обнуления 3) Пренебрежение Setlocal 3.1) Не указав Setlocal EnableDelayedExpansion, используем знаки восклицания (!) для раскрытия значения переменных 6) Инициализация числового типа данных 14) Обход ошибки "Режим вывода команд на экран (ECHO) включен" 16) Пробелы тоже могут являться частью названия переменной 23) Для команды SET всегда заключайте в кавычки переменную и значение, если ним является изменяемое имя файла 28) Двойное раскрытие переменной. Первыми раскрываются проценты. 29) Конструкция вида Echo.!Var:~0,1! не работает.

Циклы7) EOL в цикле FOR - правильный порядок модификаторов 9) Использовать UseBackQ при чтении содержимого файла, имя которого может меняться 25) Получение даты и времени файла через цикл и команду For без ключа /S (рекурсия) и подпрограммы

Кодировка4) Сохранение BAT-файла с кодировкой перевода строк в UNIX-стандарте 26) Кодировка в консоли 27) Текстовой файл не читается циклом по неизвестной причине

Тесты, оптимизация и граничные возможности интерпретатора15) Граничные значения для числового типа в CMD 19) Максимальная глубина рекурсии = 593*. 20) Максимальная длина значения строки 21) Оптимизация кода 22) Тест замедления работы операторов при перегрузке оперативной памяти

Другое1) Указывая метку подпрограммы, можно через пробел указывать ее описание. Среда не будет "ругаться" 11) Внимательно выбирайте имя для BAT(CMD)-файла

Ответ: Ошибки синтаксиса:23) Для команды SET всегда заключайте в кавычки переменную и значение, если ним является изменяемое имя файла

Правило касается команды Set, которая находится внутри скобок.Пример правильного синтаксиса:

Bash
1 (Set "File=%SomeFile%")
Исключение из правил составляет переменная цикла, например Set file=%%A

Демонстрация ошибки:

Bash
1 2 3 4 5 6 7 8 Call :Sub "myFile(1).txt" goto :eof   :Sub pause if ""=="" (Set NewFileName=%~1) pause Exit /B
Вызовет синтаксическую ошибку с прерыванием работы пакетного файла.

Чтобы увидеть ошибку, отладку можно осуществить, как обычно, запустив сначала CMD, а уже в нем BAT-файл.Также замечу, что особенностью командного процессора является отображение на экране критических ошибок не после, а до вывода строки команды, ее вызвавшей.

forundex.ru

Создание и изменение переменной, видимой в bat-файлах

Вопрос: Наиболее частые ошибки, заметки особенностей программинга BAT файлов, баги интерпретатора*

Эта тема - ответвление

Постим сюда детали, которые Вы получили опытным путем.Которые считаете уникальными, или могут быть полезными при наборе кода BAT файлов, лучшего понимания принципов работы среды командной строки.Пишем ошибки, которые иногда допускаете, а потом ломаете голову, почему не работает

Писать можно много и часто, даже если это мелочь. Все соберем вместе. Весомые замечания перенесем в указанную выше тему.

Собрано по категориям:

Файловые операции5) Использование рабочего каталога Bat файла в роле начального для выполнения команд в нем на ОС >= Vista 8) Как проверить - существует ли папка 10) Не использовать && после команды Del. 12) После перехода в другой каталог проверять успех операции 18) Листинг текущего каталога или корневого 24) Работа с файлами/папками, в именах которых есть буквы украинского алфавита.

Символы1) Экранирование спецсимвола 13) Сохранение концевого пробела в переменную 17) Запятая и точка с запятой - разделители аргументов 30) Экранирование номера потока в перенаправлении вывода Echo

Переменные2) Использование одноименных переменных без обнуления 3) Пренебрежение Setlocal 3.1) Не указав Setlocal EnableDelayedExpansion, используем знаки восклицания (!) для раскрытия значения переменных 6) Инициализация числового типа данных 14) Обход ошибки "Режим вывода команд на экран (ECHO) включен" 16) Пробелы тоже могут являться частью названия переменной 23) Для команды SET всегда заключайте в кавычки переменную и значение, если ним является изменяемое имя файла 28) Двойное раскрытие переменной. Первыми раскрываются проценты. 29) Конструкция вида Echo.!Var:~0,1! не работает.

Циклы7) EOL в цикле FOR - правильный порядок модификаторов 9) Использовать UseBackQ при чтении содержимого файла, имя которого может меняться 25) Получение даты и времени файла через цикл и команду For без ключа /S (рекурсия) и подпрограммы

Кодировка4) Сохранение BAT-файла с кодировкой перевода строк в UNIX-стандарте 26) Кодировка в консоли 27) Текстовой файл не читается циклом по неизвестной причине

Тесты, оптимизация и граничные возможности интерпретатора15) Граничные значения для числового типа в CMD 19) Максимальная глубина рекурсии = 593*. 20) Максимальная длина значения строки 21) Оптимизация кода 22) Тест замедления работы операторов при перегрузке оперативной памяти

Другое1) Указывая метку подпрограммы, можно через пробел указывать ее описание. Среда не будет "ругаться" 11) Внимательно выбирайте имя для BAT(CMD)-файла

Ответ: Ошибки синтаксиса:23) Для команды SET всегда заключайте в кавычки переменную и значение, если ним является изменяемое имя файла

Правило касается команды Set, которая находится внутри скобок.Пример правильного синтаксиса:

Bash
1 (Set "File=%SomeFile%")
Исключение из правил составляет переменная цикла, например Set file=%%A

Демонстрация ошибки:

Bash
1 2 3 4 5 6 7 8 Call :Sub "myFile(1).txt" goto :eof   :Sub pause if ""=="" (Set NewFileName=%~1) pause Exit /B
Вызовет синтаксическую ошибку с прерыванием работы пакетного файла.

Чтобы увидеть ошибку, отладку можно осуществить, как обычно, запустив сначала CMD, а уже в нем BAT-файл.Также замечу, что особенностью командного процессора является отображение на экране критических ошибок не после, а до вывода строки команды, ее вызвавшей.

forundex.ru

Как создать папку из bat файла - Bat Скрипты - Каталог статей

Для создания папки используется команда MKDIR или ее сокращенный аналог MD.Для создания папки из bat файла нужно использовать следующую команду:

MD FolderName

После выполнения такой команды будет создана папка FolderName в папке, откуда запущен bat файл. Чтобы создать файл в отличном от запуска bat файла месте, например в корне диска D, используйте явное указание расположения новой папки. Команда будет выглядеть так:

MD D:\FolderName

При создании папок можно пользоваться системными переменными. Например, можно создать в корне диска D папку с именем текущего пользователя. Для этого понадобится переменная %USERNAME%, а команда будет выглядеть следующим образом:

MD D:\%USERNAME%

Можно еще более усложнить команду и создать папку с именем текущего пользователя на системном диске его компьютера. Команда для этого будет выглядеть так:

MD %SYSTEMDRIVE%\%USERNAME%

При создании папок или файлов можно использовать любые системные переменные или их части. Следующий пример демонстрирует создание на системном диске компьютера пользователя папки с именем равным текущей дате.

set datetemp=%date:~-10% MD %SYSTEMDRIVE%\%datetemp%

Первая команда создает в памяти переменную datetemp, которая будет уничтожена по окончании работы bat файла.

То тех пор, пока bat файл не закончил свою работу есть возможность оперировать со значением этой переменной.

Переменной datetemp присваивается 10 символов справа налево от системной переменной DATE, т.е. от текущей даты.

Переменная DATE имеет формат Дн ДД.ММ.ГГГГ. Первые символы слева - имя дня недели и поэтому мы их отбрасываем и присваиваем временной переменной datetemp только текущую дату.

Этим не ограничивается список возможностей при создании папок. Вы можете опрерировать переменными так, как удобно Вам, создавая папки с уникальными, легко читаемыми названиями.

Получить список всех переменных можно при помощи команды SET.

@echo Start file>C:\1.txt

Создает файл на диске С, с названием 1.txt и содержимым Start file.

set datetemp=%date:~-10% @echo .>%SYSTEMDRIVE%\%DATETEMP%.txt

Сначала в памяти создаем переменную datetemp, которой присваиваем 10 символов справа налево от системной переменной DATE. Таким образом, теперь во временной переменной datetemp содержится только текущая дата.

Следующией строкой перенаправляем вывод символа точка в файл, имя которого берем из переменной datetemp, а расширение txt указываем явно.

Файл будет создан на системном диске компьютера, где выполняется bat файл.При сборе администратором информации о компьютерах в сети будет удобнее добавить к имени файла имя компьютера.Это легко можно сделать при помощи следующей команды:

@echo .>C:\FolderName\%COMPUTERNAME%.txt

Cоздастся на диске С текстовый файл с именем компьютера, на котором выполняется пакетный файл. Для создания файла с определенным именем можно использовать любые системные переменные, либо создать свои, на основе системных переменных и/или других данных.

delfcode.ru