Как сделать комментарий в bat файле
set "charlist primer"> set str=Как утомляет симулировать нормальность echo.%str% set str=%str:~-12% echo.%str%
Извлечение подстроки с начала строки
Извлечение подстроки с середины строки
echo.Date : %date% echo.Weekday: %date:~0,3% echo.Month : %date:~4,2% echo.Day : %date:~7,2% echo.Year : %date:~10,4%
Удаление первого и последнего символа в строке
(часто этот прием используют для удаления окаймляющих кавычек)
Удаление подстроки в строке
В данном примере из строки будет удалена подстрока "кожа "
Удаление всех пробелов в строке
Как вариант предыдущего примера
Замена подстроки в строке
set str=Я тебя раскусил, ты оборотень: то как человек, то как баран set str=%str:то=иногда% echo %str%
Объединение строк
Удаление ведущих пробелов
set str= Не ждите чуда, чудите сами echo."%str%" for /f "tokens=* delims= " %%a in ("%str%") do set str=%%a echo."%str%"
Конвертровать большие буквы в маленькие
:toLower str -- converts uppercase character to lowercase :: -- str [in,out] - valref of string variable to be converted :$created 20060101 :$changed 20080219 :$categories StringManipulation :$source http://www.dostips.com if not defined %~1 EXIT /b for %%a in ("A=a" "B=b" "C=c" "D=d" "E=e" "F=f" "G=g" "H=h" "I=i" "J=j" "K=k" "L=l" "M=m" "N=n" "O=o" "P=p" "Q=q" "R=r" "S=s" "T=t" "U=u" "V=v" "W=w" "X=x" "Y=y" "Z=z" "А=а" "Б=б" "В=в" "Г=г" "Д=д" "Е=е" "Ж=ж" "З=з" "И=и" "К=к" "Л=л" "М=м" "Н=н" "О=о" "П=п" "Р=р" "С=с" "Т=т" "У=у" "Ф=ф" "Х=х" "Ц=ц" "Ч=ч" "Ш=ш" "Щ=щ" "Ь=ь" "Ы=ы" "Ъ=ъ" "Э=э" "Ю=ю" "Я=я") do ( call set %~1=%%%~1:%%~a%% ) EXIT /b
ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
В результате, в папке, где будет запущен приведенный выше текст, создастся файл sbs2.com.
Возможно, вы будете приятно удивлены его размером - 659 БАЙТ!
Те, кому вышеприведенные изыски кажутся излишними, могут скачать готовую утилиту здесь.
Использование:
sbs2.com 0 "Old String" "New String" outfile
Осуществляется замена всех вхождений Old String на New String в файле infile. Результат запишется в файл outfile.
Такую задачу можно решить без использования сторонних программ, только средствами bat !
Ниже приведен пример с использованием локальной процедуры txtrepl
setlocal ENABLEDELAYEDEXPANSION echo off call :txtrepl end finish C:\1\24i.bat C:\1\24i.ba1 pause exit :txtrepl rem param - find, repl, from, to set FINDTXT=%1 set REPLTXT=%2 if EXIST %3 ( set FILEFROM=%3 ) else ( echo error. Not found file %3 pause exit ) set FILEOUT=%4 set COUNT=0 for /F "tokens=*" %%n in (!FILEFROM!) do ( set /A COUNT=!COUNT!+1 set LINE=%%n set TMPR=!LINE:%FINDTXT%=%REPLTXT%! if !COUNT! == 1 ( Echo !TMPR!>!FILEOUT! ) else ( Echo !TMPR!>>!FILEOUT! ) ) exit /b rem end of proc
Вывод на экран, в файл текста без перевода строки
В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.
Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.
b.txt
Использование этого приема в сочетании с символом backspace (код 08) позволяет сделать вывод на экран изменяемого текста и как вариант - "вращающейся палки".
Вычисление длины строковой переменной
В bat/cmd командах нет функции, позволяющей вычислять длину строковой переменной. А такая задача возникает не так уж и редко. Однако средств командного языка достаточно, для того что бы решить такую задачу, не прибегая к использованию специальных программ. Рассмотрим несколько вариантов решения данной задачи:
:var_count2 set /a %2 =0 set var=%~1 :startvarcount if not defined var exit /b set var=%var:~1% set /a %2+=1 goto startvarcount exit /b
Еще один вариант вычисления длины строковой переменной:
:StringLen :: ----------------------- :: Нахождение длины строки :: ----------------------- :: %1 - текстовая строка :: ----------------------- Set $StringLen=0 Set $StringBuf=%~1 If ""=="%~1" GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:~%$StringLen%%% If ""=="%$StringChr%" GOTO :EOF GoTo :StringLenLoop
Еще один способ определения длины строки, как ни странно - достаточно быстрый:
@Echo Off Set a=qwertyuiop Echo.%a%>"%TEMP%\%~n0.tmp" For %%i In ("%TEMP%\%~n0.tmp") Do Set /A z=%%~zi-2 Echo %z%
Ну и, наконец, решение, поразившее меня своей математической лаконичностью:
:strLen string len -- returns the length of a string :: -- string [in] - variable name containing :: the string being measured for length :: -- len [out] - variable to be used :: to return the string length :: Many thanks to 'sowgtsoi', but also 'jeb' :: and 'amel27' dostips forum :: users helped making this short and efficient :$created 20081122 :$changed 20101116 :$categories StringOperation :$source http://www.dostips.com ( SETLOCAL ENABLEDELAYEDEXPANSION set "str=A!%~1!"&rem keep the A up front to ensure we rem get the length and not the upper bound rem it also avoids trouble in case of empty string set "len=0" for /L %%A in (12,-1,0) do ( set /a "len|=1% >" 1 call set sim=%%str:~!BB!,1%% if "!sim!" == "" ( set /a mmax=!BB!) else ( set /a mmin=!BB! ) ) ENDLOCAL & SET /a %~2=%mmin% EXIT /b %mmin%
Получение подстроки.
Если смещение начала подстроки и ее длина являются константами - здесь все достаточно просто и аналогичный пример рассматривался выше:
Прошу прощения, если в качестве значения переменной str я опубликовал чей-то пароль )).
Если же одна или обе эти величины - переменные, то решение будет не столь простое.
Здесь встретиться возможно не совсем обычное применение команды CALL. Немного глубже об этом на странице Полезное в разделе Особенности использования команды CALL. Там же рассмотрен и этот пример.
Итак, рассмотрим возможные решения:
SetLocal EnableDelayedExpansion set str=123qwerty456 set n1=3 set n2=6 Set d2=!str:~%n1%,%n2%! Echo d2=%d2%
Или как вариант предыдущего
setlocal ENABLEEXTENSIONS SetLocal EnableDelayedExpansion set str=zaq12wsx set n1=3 set n2=6 call :SUBSTRING str,%n1%,%n2% echo %SUBD% . :SUBSTRING set SUBD=!%1:~%2,%3! exit /b
Удаление ведущих и замыкающих пробелов.
:ALLTRIM :: ----------------------- :: Krasner B. :: ----------------------- :: %1 - var with txt string :: ----------------------- SetLocal EnableDelayedExpansion set /a firstnoblank=-1 set /a lastnoblank=0 set /a curpos=1 set "str=Q!%1!" :StringLenLoop set SUBD=!str:~%curpos%,1! if "!SUBD!" == "" GoTo :formrez if NOT "!SUBD!" == " " ( if !firstnoblank! == -1 set firstnoblank=!curpos! set lastnoblank=!curpos! ) set /a curpos = !curpos!+1 GoTo :StringLenLoop :formrez set /a n1=!firstnoblank!-1 set /a n2=!lastnoblank!-!firstnoblank!+1 if !firstnoblank! == -1 (set "rez primer"> set "strr strrr= 22 33 " Call :ALLTRIM strrr echo result ALLTRIM ^>%strrr%^ корректный
Для начала скажу, что я зарабатываю через вот этого брокера , проверен он временем! А вот хороший пример заработка , человек зарабатывает через интернет МНОГО МНОГО МНОГО и показывает все на примерах, переходи и читай! Добавь страницу в закладки. А теперь читаете информацию ниже и пишите свой отзыв
У меня есть пакетный файл, который запускает несколько скриптов Python, сделать таблицу модификаций.
Первую часть моего вопроса: я хочу, чтобы пользователи закомментируйте 1-2 скриптов Python, что они не хотят работать, а не извлекать их из пакетного файла(так что следующий пользователь знает эти сценарии существуют как варианты!)
Во-вторых: я также хочу добавить комментарии, чтобы привлечь их внимание конкретно переменные, их нужно обновлять в пакетном файле, прежде чем они управляют ею.
Я вижу, что я могу использовать рем…. но, похоже, это больше для обновления пользователю прогресс после того как они провели его.
Существует ли синтаксис для более целесообразно добавление комментария?
В :: вместо того, чтобы рем был предпочтительно использовать в те дни, когда компьютеры были не очень быстрый. Рем видел строки считываются и затем ingnored. ::’Эд строки игнорируются полностью. Это может ускорить ваш код в “старые времена”. Дальше больше, после рем нужен пробел, после :: не.
И как сказал в первом комментарии: Вы можете добавить информацию по любой линии вы чувствуете необходимость
Как для пропуска деталей. Поставив рем напротив каждой линии может быть достаточно трудоемким. Как уже упоминалось, используя goto, чтобы пропустить части-это простой способ, чтобы пропустить большие куски кода.
Обязательно установить :метка в точке, вы хотите, чтобы код, чтобы продолжить.
У меня есть пакетный файл, который запускает несколько скриптов python, которые делают изменения таблицы.
Я хочу, чтобы пользователи комментировали 1-2 скрипта python, которые они не хотят запускать, а не удаляли их из пакетного файла (поэтому следующий пользователь знает, что эти скрипты существуют как параметры!)
Я также хочу добавить комментарии, чтобы привлечь их внимание к переменным, которые они должны обновить в пакетном файле, прежде чем запускать его. Я вижу что я могу использовать REM . Но похоже, что это больше для обновления пользователя с прогрессом после его запуска.
есть ли синтаксис для более точного добавления комментария?
The rem команда действительно для комментариев. Он по своей сути не обновляет никого после запуска сценария. Некоторые авторы сценариев могут использовать его таким образом вместо echo , хотя бы потому, что по умолчанию пакетный переводчик распечатать каждая команда перед обработкой. С rem команды ничего не делай, безопасно печатать их без побочных эффектов. Чтобы не печатать команды, добавлять @ , или, чтобы применить этот параметр во всей программе, запустите @echo off . (Это echo off чтобы избежать печати дополнительных команд; @ чтобы избежать печати это команда до установки Эха вступает в силу.)
так, в пакетном файле, вы можете использовать этот:
your commands here :: commenttttttttttt
your commands here REM commenttttttttttt
во вложенных логика ( IF-ELSE , FOR петли и т. д. ) :: срабатывает ошибка, поэтому используйте REM там или бежать с помощью ^ характер, ex. ^( и ^)
в определенных случаях (если вы используете его inline), вам может потребоваться добавить & знак: & :: commenttttt
нет, обычные старые пакетные файлы используют REM в качестве комментария. ECHO - это команда, которая печатает что-то на экране.
чтобы "прокомментировать" разделы файла, которые вы могли бы использовать GOTO . Пример всех этих команд/технологий:
что я могу сказать? пакетные файлы-это пережиток давно ушедших времен, они неуклюжи и уродливы.
вы можете подробнее на этом сайте.
EDIT: немного изменил пример, чтобы он был содержат элементы, которые вы, по-видимому, ищет.
:: вместо REM предпочтительно использовать в те дни, когда компьютеры не были очень быстрыми. REM'ed строки читаются, а затем ingnored. :: 'ed line полностью игнорируются. Это может ускорить ваш код в "старые времена". Далее после Рем нужен пробел, после :: нет.
и, как сказано в первом комментарии: Вы можете добавить информацию в любую строку, которую вы чувствуете необходимость
Что касается пропуска частей. Положить REM перед каждой строкой может быть довольно время всепоглощающий. Как уже упоминалось, использование GOTO для пропуска частей-это простой способ пропустить большие части кода. Обязательно установите метку :в точке, в которой вы хотите, чтобы код продолжался.
мульти строка комментария
если есть большое количество строк, которые вы хотите прокомментировать, то будет лучше, если вы можете сделать многострочные комментарии, а не комментировать каждую строку.
язык пакета не имеет блоков комментариев, хотя есть способы достижения эффекта.
можно использовать GOTO Label and: Label для создания комментариев блоков.
или, если блок комментариев появится в конце пакетного файла, вы можете пиши EXIT В конце кода, а затем любое количество комментариев за ваше понимание.
размещение комментариев в одной строке с командами: use & :: comment
объяснение:
& отделяет две команды, так что в данном случае color C является первой командой и :: set red font color - второй.
важно:
это утверждение с комментарием выглядит интуитивно правильным:
но это недопустимое использование комментария. Работает только потому что goto игнорирует все аргументы после первого. Доказательство легко, это goto тоже не подведет:
но подобная попытка
не удается выполнить команду из-за 4 аргументов, неизвестных : :: , grey , on , blue .
он будет работать только как:
Итак, амперсанд неизбежен.
вы можете прокомментировать то, что с помощью :: или REM :
чтобы сделать это в той же строке, что и команда, необходимо добавить амперсанд:
У меня есть пакетный файл, который запускает несколько сценариев Python, которые вносят изменения в таблицу.
Я хочу, чтобы пользователи закомментировали 1-2 сценария Python, которые они не хотят запускать, вместо того, чтобы удалять их из командного файла (чтобы следующий пользователь знал, что эти сценарии существуют как опции!)
Я также хочу добавить комментарии, чтобы привлечь их внимание конкретно к переменным, которые им нужно обновить в пакетном файле, прежде чем они его запустят. Я вижу, что могу использовать REM . Но похоже, что это больше для обновления пользователя с прогрессом после его запуска.
Есть ли синтаксис для более подходящего добавления комментария?
Команда rem действительно для комментариев. Он не обновляет никого после запуска скрипта. Однако некоторые авторы сценариев могут использовать его вместо echo , потому что по умолчанию пакетный интерпретатор распечатывает каждую команду перед обработкой. Поскольку команды rem ничего не делают, их можно печатать без побочных эффектов. Чтобы не печатать команду, добавьте к ней префикс @ или, чтобы применить этот параметр ко всей программе, запустите @echo off . (Это echo off , чтобы не печатать дальнейшие команды; @ - чтобы не печатать та команду до вступления в силу настройки эха.)
Итак, в вашем командном файле вы можете использовать это:
:: или REM
НО (как отметили люди):
- Если вы используете inline, вам нужно добавить символ & :
your commands here & :: commenttttttttttt - Внутри вложенной логики ( IF/ELSE , FOR циклов и т.д.) Используйте REM , поскольку :: выдает ошибку.
- :: может завершиться ошибкой в setlocal ENABLEDELAYEDEXPANSION
Нет, обычные старые командные файлы используют REM в качестве комментария. ECHO - это команда, которая печатает что-то на экране.
Что я могу сказать? пакетные файлы являются пережитком давно ушедших времен, они неуклюжи и безобразны.
Вы можете прочитать больше на этом сайте .
Правка: немного изменил пример, чтобы он содержал элементы, которые вы, очевидно, ищете.
И, как сказано в первом комментарии: вы можете добавить информацию в любую строку, в которой вы чувствуете необходимость
Что касается пропуска частей .. Помещение REM перед каждой строкой может занять довольно много времени .. Как уже упоминалось, использование GOTO для пропуска частей - это простой способ пропустить большие куски кода. Обязательно установите: LABEL в том месте, где вы хотите, чтобы код продолжался.
Многострочные комментарии
Если есть большое количество строк, которые вы хотите закомментировать, то будет лучше, если вы сможете делать многострочные комментарии, а не комментировать каждую строку.
Пакетный язык не имеет блоков комментариев, хотя есть способы добиться эффекта.
Вы можете использовать GOTO Label и: Label для создания блочных комментариев.
Или, если блок комментариев появляется в конце пакетного файла, вы можете написать EXIT в конце кода, а затем любое количество комментариев для вашего понимания.
Размещение комментариев в одной строке с командами: используйте & :: comment
Объяснение:
& разделяет две команды , поэтому в этом случае color C - первая команда, а :: set red font color - вторая.
Важный:
Это утверждение с комментарием выглядит интуитивно правильным:
но это недопустимое использование комментария. Это работает только потому, что goto игнорирует все аргументы после первого. Доказательство легко, эта goto также не потерпит неудачу:
Но похожая попытка
не удается выполнить команду из-за 4 аргументов, неизвестных команде color : :: , grey , on , blue .
Это будет работать только как:
Таким образом, амперсанд неизбежен.
Вы можете что-то закомментировать, используя :: или REM :
Чтобы сделать это в той же строке, что и команда, необходимо добавить амперсанд:
Замечания:
- Использование :: во вложенной логике ( IF-ELSE , FOR циклы и т.д.) Вызовет ошибку. В этих случаях используйте REM вместо этого.
Это старая тема, и я хотел бы добавить свое понимание здесь, чтобы расширить знания этой интересной темы.
Основное различие между REM и .
REM сама команда, а :: НЕ.
Мы можем трактовать :: как токен, который, как только синтаксический анализатор CMD встретит первый непустой пробел в строке, будет следующим :: токеном, он просто пропустит всю строку и прочитает следующую строку. Вот почему за REM должен следовать хотя бы пробел, чтобы он мог выступать в качестве комментария для строки, в то время как :: не нужно никакого пробела позади нее.
То, что REM является самой командой, лучше всего понять из следующего синтаксиса ДЛЯ
Основной синтаксис FOR следующий
здесь может быть любой допустимой командой Так что мы можем написать следующую допустимую командную строку, так как rem является командой
Однако мы НЕ МОЖЕМ написать следующую строку, так как :: не является командой
Урок bat-аники
Однако в нашей повседневной деятельности встречаются и вещи, которые не так интересны и интеллектуальны. Мы не очень любим говорить об этом, делаем вид, что Это – грязно, нечистоплотно и недостойно нашего внимания. Однако, приходит день, приходит час и перст Судьбы находит нас – нам надо написать еще один батничек… Иногда это запускалка для построения проекта, которая должна при ошибке компиляции скопировать логи на сетевой диск, иногда – запуск обновления исходных текстов из SVN. Иногда – что-нибудь еще.
К чему я это все? А к тому, что поговорим мы о полезных хитростях при написании файлов сценариев на встроенном командном языке Windows. К счастью, это занятие не является доминирующим в профессиональной деятельности автора, так что я не обязуюсь заполнить абсолютно все пробелы в данной области. Кроме того, рожденный ползать летать не может, и из cmd.exe, увы, не получится ни /usr/bin/perl, ни даже /bin/sh. Так что, все нижеприведенное – просто некоторые интересные факты из жизни файлов с расширением bat, на которые автор обратил внимание во время решения различных практических задач автоматизации.
ПРЕДУПРЕЖДЕНИЕ
Практически все описанные здесь рецепты подойдут только для Windows 2000 и старше. Bat-язык Windows 9x, к счастью, можно считать почившим, так что здесь он не рассматривается. Более того, диалекты cmd.exe операционных систем Windows 2000, Windows XP и Windows Server 2003 также немного различаются. Все приведенное ниже создано и проверено на компьютере под управлением операционной системы Windows XP. За подробной информацией по различиям в реализации той или иной команды обращайтесь к [1].
Как экранировать символ?
В командном языке Windows существует некоторый набор символов с высоким приоритетом, которые всегда трактуются как спецсимволы. К ним, в частности, относятся:
- Операторы перенаправления ввода-вывода , >>.
- Оператор конвейера |.
- Операторы объединения команд ||, & и &&.
- Оператор разыменования переменной %…%.
В случае если символ, относящийся к одному из таких операторов, должен быть включен в вашу команду в его литеральном смысле, вас ждут определенные неожиданности. Например, при выполнении вот такой строки
после чего все заработает так, как надо. Однако в других случаях все менее очевидно. Рассмотрим командный сценарий, который генерирует незатейливый HTML-файл:
приведет к тому, что в выходной файл будут записаны и сами кавычки. Это явно не совсем то, что требуется.
К счастью, есть один малоизвестный способ, позволяющий добиться требуемого результата. Символ ^ позволяет экранировать любой другой символ с безусловным приоритетом. Таким образом, вышеприведенный пример генерации HTML может быть успешно записан так:
Как перенести длинную строку?
Совет по поводу экранирующего символа ^ имеет еще одно применение: перенос строк. Я (как и многие из вас, наверное) люблю, чтобы любой исходный текст, который я пишу, выглядел красиво – даже *.bat-файлы. Одним из обязательных условий красоты и удобочитаемости кода для меня является его ширина: все строки должны умещаться в 78 столбцов. Можно поспорить по поводу числа 78, но в одном я непреклонен – ограничение на ширину текста кода должно быть, иначе это не код, а макароны.
Так вот долгое время *.bat-файлы портили мне жизнь тем, что иногда приходилось писать длинную строку – например, вызов какой-нибудь другой программы с кучей опций, и я не знал, что с этим делать. Происходило это нечасто, но всегда было неприятно. Но, к счастью, моя жизнь изменилась с тех пор, как я открыл для себя Супер-Символ ^:
Читайте также: