- SS64
- CMD
- How-to
How-to: Escape Characters, Delimiters and Quotes at the Windows command line.
Delimiters separate one parameter from the next — they split the command line up into words.
Parameters are most often separated by spaces, but any of the following are also valid delimiters:
Comma (,)
Semicolon (;)
Equals (=)
Space ( )
Tab ( )If you are passing a parameter to a batch file that contains any of these delimiter characters, it will split the parameter into two parameters unless you surround the whole thing with double quotes: «this is;one=param,»
Consecutive delimiters will be treated as one, even if they are different characters.
Notice that although / and — are commonly used to separate command options, they are absent from the list above. This is because batch file parameters are passed to CMD.exe which can accept its own parameters (which are invoked using / and — )
The default token delimiters in a FOR IN() clause are the same as on the command line but the delims= option is available to specify something different. When FOR /F is used to process a string, the default delimters are Space and TAB.
When using the TAB character as a delimiter be aware that many text editors will insert a TAB as a series of SPACEs.
If you use %* to refer to all parameters, the value returned will include the delimiters.
Escape Character
^ Escape character.Adding the escape character before a command symbol allows it to be treated as ordinary text. These characters which normally have a special meaning can be escaped and then treated like regular characters : & \ < > ^ |
Echo THIS ^& THAT
Echo Heading1 ^| heading2 ^| heading3
Echo The Escape character looks like this ^^
Escape CR/LF line endings.
The ^ escape character can be used to make long commands more readable by splitting them into multiple lines and escaping the Carriage Return + Line Feed (CR/LF) at the end of a line:
ROBOCOPY \\FileServ1\e$\users ^
\\FileServ2\e$\BackupUsers ^
/COPYALL /B /SEC /MIR ^
/R:0 /W:0 /LOG:MyLogfile.txt /NFL /NDL
- A stray space at the end of a line (after the ^) will break the command, this can be hard to spot unless you have a text editor that displays spaces and tab characters.
- If you want to comment something out with REM, then EVERY line needs to be prefixed with REM.
- If you use a double colon :: as a REM comment, that will still parse the caret at the end of a line, so in the example above changing the first line to :: ROBOCOPY… will comment out the whole multi-line command.
A ^ escape character at the end of a line can have an undesirable effect on comments, extending them to the next line.
To avoid this use REM or add a trailing space (or any other character) after the caret.:: This line is a comment ^
Echo and this line will not display.:: This line is a comment ^ ::
Echo and this line will display.
Escape and the pipeline
When piping or redirecting text, applying an escape character gets a little more complex, a pipe will start two new cmd.exe instances, each of these cmd processes are passed one side of the pipe and will parse their part once again (with the cmd-line parser, not with the batch-line-parser).
Knowing this you might try:
Echo THIS ^^& THAT | subroutine
So the new cmd instance would be passed THIS ^& THAT and everything would work? Not so fast, with two carets together, the first will escape the second, meaning that the & is no longer escaped at all.Echo This ^^^& That | subroutine
In this version, the first caret escapes the second caret ‘^’, the third caret escapes the ‘&’ so now the new cmd instance inherits ^&
(Many thanks to Jeb who explained this over in the forum better than I could.)When ECHOing a string with an odd number (or just an unknown number) of embedded quotes through the pipeline, the outer quotes should be escaped:
ECHO "abc"def" | FIND "def" ECHO ^"abc"def^" | FIND "def"
Escape Percents
The % character has a special meaning for command line parameters, variable names and FOR parameters.
To treat a percent as a regular character in a batch file, double it:%%
At the command line (not in a batch file) there are no parameters (%1, %2… ) so doubling a percent character is not needed and will not work as an escape.
Many characters such as \ = ( ) do not need to be escaped when they are used within a «quoted string» these are characters you might find in a filename/path. The % character is one exception to this rule, it is a valid NTFS filename character but also will be evaluated as a variable name even within a quoted string.
Escape Exclamation marks
When the shell is running in EnableDelayedExpansion mode the ! character is used to denote a variable and so must be escaped (twice) if you wish to treat it as a regular character:
^^!
Escape the Escape character
The escape character can be used to escape itself ^^ (so the first ^ will escape the second):
The characters in bold get escaped: ^& => &
^^ => ^
"^^" => "^^" ^^^& => ^&
^^^^ => ^^ ^^^^^& => ^^&This changes slightly if you are running with DelayedExpansion of variables: if any part of the command line includes an ‘!’ then CMD will escape a second time, so ^^^^ will become ^ [source] Quoted carets passed to CALL are a special case.
Special Cases using backslash escape
A small number of commands follow slightly different rules, FINDSTR, REG and RUNAS all use \ as an escape character instead of ^ (as also used by C, Python, SQL, bash and many other languages).
The \ escape can cause problems with quoted directory paths that contain a trailing backslash because the closing quote » at the end of the line will be escaped \».
To save a directory path with a trailing backslash (\) requires adding a second backslash to ‘escape the escape’
so for example instead of «C:\My Docs\» use «C:\My Docs\\»To be sure that a path includes a trailing backslash, you can test for it:
Set _prog=C:\Program Files\SS64 App
IF %_prog:~-1% NEQ \ (Set _prog=%_prog%\)
Echo «%_prog%»
Escape «Double Quotes»
If a single parameter contains spaces, you can pass it as one item by surrounding in «quotes» — this works well for long filenames.
In many places, e.g. the FIND comand, a « quote can be escaped by doubling it to «»
If a parameter is used to supply a filename like this:
MyBatch.cmd "C:\Program Files\My Data File.txt"The parameters will be:
%0 =MyBatch
%1 ="C:\Program Files\My Data File.txt"To launch a batch script with spaces in the script Path and other parameters, all requiring quotes:
CMD /k ""c:\batch files\test.cmd" "Parameter 1 with space" "Parameter2 with space""Double quotes in a command line with a backslash escape:
powershell.exe -command «&{$m = \»hello world\»;write-host $m}»
This can also be written with 3 quotes:
powershell.exe -command «&{$m = «««hello world»««;write-host $m}»
or more simply with powershell’s single quotes:
powershell.exe -command «&{$m = ‘hello world’;write-host $m}»
or for SQL:
sqlplus.exe user/\»«password with spaces»\»@service
Removing Quotes
Several methods for removing quotes are listed on the dequote page.
Working without Quotes
Without surrounding quotes, a long filename will be passed as %1 %2 %3…
MyBatch C:\Program Files\My Data File.txtTo refer to the pathname above use %* rather than %1 %2 %3 — the %* will cover all parameters — even if there are more than %9
You can apply Extended Filename syntax to %* by passing the value to a subroutine:
@ECHO OFF SET _params=%* :: pass params to a subroutine CALL :sub "%_params%" GOTO :eof :sub :: Now display just the filename (not path) ECHO %~n1
“All the best stories in the world are but one story in reality — the story of escape. It is the only thing which interests us all and at all times, how to escape” ~ A. C. Benson
Related commands
SETLOCAL EnableDelayedExpansion — More examples, particularly for HTML.
How-to: Long Filenames and NTFS — Valid characters in filenames.
FINDSTR Escapes and Length limits.
How-to: Parameters — Command Line Arguments %1 %~f1.
PowerShell equivalent: PowerShell Escape Character
In bash use \ to escape a line ending.
How does the Windows Command Interpreter (CMD.EXE) parse scripts? — StackOverflow.
Why is the DOS path character «\»? — Larry Osterman
Copyright © 1999-2025 SS64.com
Some rights reserved
Неочевидное поведение команд в командной строке.
Создав супер быстрый алгоритм BAT CMD, сумевший ушатать интерпретатор командной строки Windows — я столкнулся с неожиданно неочевидным поведением команд, о котором если и догадывался ранее, то — весьма туманно и неопределённо … Даже, не знаю — с чего начать ))) …
Установщик SET.
Давайте начнём с команды установщика SET … Почему — установщик ? …
Помогая выполнять арифметические операции SET /A B=2+5 эта команда принимает + как руководство к действию, сумматор, и вычисляя 2+5 — устанавливает переменной %B% значение =7 … Можно сказать, и — присваивает … Но …
присвоить — assign, appropriate … значить — пометить, заимствовать себе … в то время, как …
установить — install, place, mount, fix, specify, adjust, fit … что в переводе с английского — объединяет все действия к общей идее — установить нечто — на своё место ; приспособить — таким образом, чтобы со всех сторон, это выглядело — правильно … Поэтому, установщик — наиболее подходящее слово … Тем более, в других языках, оператор присваивания, это знак = равно …
Тем, более — SET — не только вычисляет … А, вот и — подходящий пример …
Установите переменной а значение & …
SET a=& … не работает … ECHO %a% = %a% …
Наверно, надо экранировать символ … Среди специальных символов, используемых в командной строке, можно выделить следующие : & | > < / ? * %
, которые используются для соединения команд, перенаправления ввода / вывода, поиска файлов по маске и т.д. … Амперсанд — входит в их число, и подлежит экранированию …
Что, чем и как экранировать ? … символ ^ экранирует практически всё, включая самого себя … Подробнее про экранирование спец символов, можно будет прочитать — ниже …
Значит нужно экранировать — так : ^& … Пробуем …
SET a=^& … не работает … ECHO %a% = Режим вывода команд на экран (ECHO) включен …
Ого, крепкий орешек ))) …
Начинаем искать специальные знания и натыкаемся на совет — использовать кавычки … Обычно, кавычки применяются, когда нужно игнорировать пробел в значении переменной, обычно воспринимаемый, как — делитель параметров … Также, кавычки — являются своеобразным экраном текстовых символов и строк … Что же — пробуем …
SET «a=&» … не работает … ECHO %a% = Режим вывода команд на экран (ECHO) включен … Тот же вид, только сбоку ))) … Ну, что же, поскольку мыслей больше нет — объединяем все известные способы — в одно целое …
SET «a=^&» … ура … заработало … ECHO %a% = & …
Посмотрите, вам не кажется эта запись кавычек — совершенно неочевидной … Наверное правильнее, было бы записать это выражение — так …
SET a=»^&» … Оказывается — нет … Эта запись — неправильная … Оказывается ещё и то, что команда SET — уже имеет неявные кавычки, которые гласят : всё, что находится внутри кавычек — принадлежит переменной a …
SET a=»^&» … ECHO %a% = «^&» … Явные кавычки и то, что экранировано внутри них — стало принадлежать неявным кавычкам и, соответственно — оператору / переменной а … Вот это наиболее яркий пример совершенно неочевидного поведения интерпретатора командной строки …
В случае математики, этот пример — не показывает такой нужной наглядности …
SET /A «a=2+5″ или SET /A a=»2+5» всё равно дают a = 7…
Теперь, посмотрим кавычки с пробелом в пути …
SET a=c:\my folder … ECHO %a% = c:\my folder … Пока вы оперируете переменной внутри интерпретатора командной строки — кавычки не имеют большого значения (до сложных случаев экранирования спецсимволов) … В 99% стандартных операций с текстом и числами, кавычки — не потребуются …
Создадим папку c:\my folder и внутри my folder.txt и выполнить команду …
DIR %a% … Содержимое папки c:\ — файл не найден … Содержимое папки c:\users\user — файл не найден …
DIR «c:\my folder» … Явным прямым указанием проверяем, есть ли такой каталог на диске, а в кавычках — потому-что есть пробелы в пути … Содержимое папки c:\my folder … файл my folder.txt … Всё прекрасно видится и читается … Изменяем команду установщика пути …
SET «a=c:\my folder» … ECHO %a% = c:\my folder … Эта команда — снова не подойдёт, так как не содержит кавычек, экранирующих пробелы в пути …
SET a=»c:\my folder» … Именно в этом случае, нужен — неправильный вариант команды, который фактически выглядит, как SET «a=»c:\my folder»» — внутри неявных кавычек SET …
ECHO %a% = «c:\my folder» … Проверяем значение переменной … Другое дело ))) …
DIR %a% … Проверяем DIR … Содержимое папки c:\my folder … файл my folder.txt … Всё работает … Когда вы используете пробелы или спец символы — в виде текста команды, в интерфейсе командной строки Windows — они подлежат экранировке, чтобы не быть интерпретированными — как управляющий операторы или конструкции синтаксиса …
Командная строка. Интерпретатор CMD. Интерфейс Windows.
Многие, наблюдая черный экран DOS в среде Windows — воспринимают его, как обычную программу CMD.EXE, считая этот способ взаимодействия с компьютером и ОС — страшным, сложным, непрактичным и устаревшим ))) … После много красочной Windows — очень некомфортно оказаться в среде, без графического интерфейса и визуальной обратной связи … На самом деле, это — одно из жесточайших и неочевидных заблуждений … Нужно явно понимать, что эти разные концепции командной строки, интерпретатор CMD и интерфейс Windows — тесно интегрированы одно в другое … Отсюда и проистекает понимание, того — как воспринимать спец символы — в зависимости от среды обработки …
Интерпретатор CMD командной строки … Если специальные символы или управляющие операторы используются для вычислений параметров и результатов команды — внутри самой себя — спецсимволы должны экранироваться, чтобы отменить их специальное действие и представить их в виде обычных тексто / графических символов …
Напечатать строку a > b … Это — не выражение, и не переменные — обычный текст …
ECHO a > b … не даст ничего — бред, с точки зрения интерпретатора …
«ECHO a > b» … заставить интерпретатор ответить явно, в чем бред ? ))) … не является внутренней или внешней командой, исполняемой программой или пакетным файлом …
ECHO «a > b» … напечатает «a > b» , так как кавычки — отменяют действие оператора перенаправления > и попадают в область действия неявных кавычек ECHO, поэтому — тоже будут отображены …
ECHO a ^> b … напечатает a > b … экранировать только действие оператора перенаправления (среди текстовых символов) … В ответ — ECHO напечатает обычные символы, как эхо в горах — что крикнешь, то и услышишь ))) …
Интерфейс Windows командной строки …
SET a=3
SET b=5
ECHO %a%>%b% … так как % попытался экранировать символ перенаправления > , а ECHO — не смогла сказать чего либо внятного — она отрапортовала, что : Режим вывода команд на экран (ECHO) включен … То есть — команда сообщила свой статус …
ECHO %a% > %b% … ничего, тишина ))) … Попробуем заставить CMD дать явный ответ …
«ECHO %a%>%b%» … «ECHO %a% > %b%» … echo 3>5 и echo 3 > 5 — действительно не являются никакими командами, а Эхо не может заместить или пере вычислить значение одним оператором — в другом …
ECHO %a%+=%b% … напечатает 3+=5 … это просто текст …
ECHO %a% … отобразит значение переменной a = 3 …
Однако, ECHO %a% > nul … не отобразит вывод Эхо, перенаправив его в специальный контроллер nul — это специальное устройство в операционной системе Windows, которое используется для отключения вывода текста в командной строке … нулевое устройство — есть, но не сохраняет вывод команд … что то вроде ассемблерной команды NOP — ничего не делать … Однако, ничего не делая, команда — тратит процессорное время, создаёт задержки, выравнивает блоки в памяти и вообще — является реальной командой с возможностью обращения к ней (программная заглушка) …
Однако, ECHO %a%>nul … Эхо снова сообщит свой статус, так как % снова попытается экранировать символ перенаправления и будет сбивать с толку интерпретатор данных и команд … Но, на самом деле, в обычном программном коде, подобная запись, без пробелов — практически не вызывает проблем, насколько я могу вспомнить … Какое значение имеет пробел в данных и командах BAT CMD ? …
Суть сравнения интерпретатора CMD и интерфейса Windows одного и того же выражения / окна командной строки — в том, что если неочевидно, к какому результату приведет действие той или иной команды, расположения спецсимволов и пробелов — лучше убедиться, в этом — заранее ))) …
Пробел в командах и данных BAT CMD.
Иногда, для красоты кода, в примерах программирования, команды, данные и спец символы управляющих конструкций — вводят через пробел …
SET a = 3 … результат ECHO %a% = 3 , но иногда может быть %a% = %a% , то есть — переменная не была пере / или — определена …
SET a = 3 ; SET a = 4 … результат ECHO %a% = 3 … Снова — бардак на раздаче … Эта ситуация может сложиться из-за неопределенного состояния регистров интерпретатора (предположение) после выполнения прошлых команд … Но, согласитесь, в этом — что-то есть и кроется какой-то нюанс ))) …
SET b=4 … ECHO %b% = 4 …
SET b=5 … ECHO %b% = 5 … Никаких проблем — не наблюдается … Сравните с предыдущим примером ECHO %a%>nul и ECHO %a% > nul …
Пробелы в командах BAT CMD имеют важное значение, поскольку они используются для разделения аргументов командной строки … В большинстве случаев пробелы между аргументами нужны, чтобы команда корректно выполнилась … Однако, есть некоторые случаи, когда в командах нужно использовать кавычки для защиты пробелов внутри аргументов …
Также пробелы — могут быть использованы в данных, передаваемых в команду … Если данные содержат пробелы, то их также нужно заключать в кавычки или экранировать символом ^ чтобы команда работала правильно …
Режим SetLocal EnableDelayedExpansion — может быть полезным и рекомендуется, так как позволяет использовать переменные — с пробелами внутри значений … В любом случае, использование пробелов в командах и данных в командной строке следует использовать — осторожно и — правильно экранировать символы, если это необходимо для корректной работы программного кода …
Программные файлы интерфейсы физического оборудования ПК.
В командах BAT CMD, кроме NUL — есть несколько других специальных файлов-устройств, которые могут использоваться в качестве контролов … Эти файлы-устройства предоставляют доступ к различным физическим устройствам компьютера через командную строку и могут быть использованы как входные и выходные интерфейсы для команд …
CON — консольный ввод / вывод, для ввода с клавиатуры и вывода на экран …
PRN — принтер, для вывода команд на принтер …
LPT1 (LPT2 , LPT3) — параллельные порты коммуникации ПК, в настоящее время устарели и могут быть задействованы через драйвера ОС адаптеров переходников USB — LPT …
COM1 (COM2 , [COM3 , COM4]) — последовательные порты ввода / вывода и обмена данными ПК c периферийными устройствами … В настоящее время — практически устарели, но ещё очень много софта и программ требует их для своей работы, и они могут быть задействованы через драйвера ОС широко распространенных версий адаптеров переходников USB — COM / RS-232 …
Различные наглядные примеры использования программных файлов физических устройств в командах BAT / CMD … COPY file.txt CON … DIR > LPT1 … ECHO %a% > COM1 … Однако — следует быть осторожными при использовании этих файлов-устройств, поскольку неверное использование может привести к непредсказуемым результатам, ошибкам устройства и прочим неожиданно / неприятным событиям …
Передача параметров между сценариями BAT CMD.
Для передачи параметров из одного .bat файла в другой, можно использовать оператор CALL … Эта команда вызывает один сценарий из другого, при этом некоторые данные можно передать, как входные параметры для вызываемого файла, до 9, через разделитель пробел …
CALL 2.bat aaa bbb ccc …
При запуске, BAT / CMD умеет принимать параметры %0 — %9, при этом %0 — уже занят текущим именем файла (текущим расположением пути запуска скрипта) …
CALL b.cmd … %0 = b.cmd ; остальные параметры — пустые (не определены) …
CALL b.cmd a b c d e f g h i j k l m n o … Пытаемся передать 15 параметров, и получаем … %0=b.cmd … %1=a … %2=b … %3=c … %4=d … %5=e … %6=f … %7=g … %8=h … %9=i … — это, то, что можно явно передать, как параметры … Но, если продолжить, то увидим : %10=a0 … … %11=a1 … %12=a2 … %13=a3 … %14=a4 … %15=a5 … Какие-то индексы неопределённых внутренних структур …
CALL b.cmd … Если же — вызвать сценарий скрипта — без параметров, но попытаться считать те же самые %0 — %15, то увидим — такую картину : b.cmd . . . . . . . . . 0 1 2 3 4 5 , где точки — это пустые, но осязаемые пробелы …
Модификатор %~1 используется для удаления любых кавычек, которые могут быть включены в параметр для защиты от пробелов … Нужные кавычки, также — передаются внутри кавычек, с последующим очищением внешних — модификатором %~ получения и преобразования входного параметра …
Упоминалось, что если параметр содержит знак = в начале имени — то от него невозможно отделаться никоим образом или способом … В моём случае на CMD Win7, это — не подтвердилось (=x обрезается до x ; кавычки — снимаются ) … Пример — ниже … Для удобства я располагаю его вертикально, чтобы было понятно, какой слева отправляемый параметр и справа — принимаемый …
%% … a.cmd … b.cmd
%0 … — … b.cmd
%1 … «a b» … «a b»
%2 … «c d» … «c d»
%3 … =e … e
%4 … «=f» … «=f»
%~5 … «=g» … =g
%6 … h … h
%7 … i … i
%8 … j … j
%9 … k … k
Несмотря на то, что внешне — всё работает исправно, сложные случаи параметров рекомендуется передавать — через внешние файлы …
Прочие особенности команд командной строки.
О сложности, неадекватности, неожиданности, непредсказуемости и неочевидности поведения команд командной строки, можно писать, если не вечно, то — много и долго ))) … Несмотря, на всю простоту и примитивность BAT CMD интерпретатора …
RANDOM.
Я не заметил никакой принципиальной разницы между %RANDOM% и !RANDOM!, хотя упоминается, что она — есть ))) …
SET.
Команда SET может неявно обрезать пробелы в начале и конце значения переменной, если ее определение задано с пробелами … Но я бы сильно не рекомендовал полагаться на неочевидность и непредсказуемость её поведения ))) …
SET a= 5 … ECHO %a% = пробел5 …
FOR.
В команде FOR имеется неявное поведение, когда переменная цикла $ может не подставляться, если она используется в блоке команд FOR сразу после DO — вернет только первый вариант %i, но не второй и третий … Не знаю, у меня — работает …
FOR %%I IN (1) DO ECHO %%I %%I %%I … ответ : 1 1 1 …
ECHO.
В команде ECHO есть неявный символ перевода строки, добавляющийся в конец строки — может создавать проблемы, если не учитывать его влияние …
ECHO /n aaa — запрет переноса строки — не работает, в моём случае … так и в справке по команде — нет этой опции ))) …
START.
Команда имеет неявное поведение, когда она используется для запуска графического интерфейса (GUI) … При запуске графического интерфейса с помощью команды START будет создан новый экземпляр командной строки, что может привести к непредвиденным результатам, если большинство команд ожидает выполнения — в той же командной строке …
DIR.
В случае с командой DIR, спецсимволы &, <, > или | — не требуют экранирования, так как они используются только для операций в командной строке, а не внутри команды DIR самой в себе …
Экранирование спецсимволов.
Действительно, при работе в языке BAT и CMD символы %, !, ^, «, &, ?, *, / — имеют особое значение … Для того чтобы использовать их в командной строке, необходимо использовать экранирование символов … Что, чем и как экранировать ? …
Символ ^ экранирует практически всё, включая самого себя … Символ ^ используется в CMD / BAT для экранирования символов …
Амперсанд &, оператор объединения команд в одной строке …
Угловые скобки < >, оператор перенаправления …
Вертикальная черта / штрих |, оператор конвейера …
Скобки ( ), символ группировки …
Звездочка *, шаблон подстановки имён файлов и папок …
Знак вопроса ?, маска для поиска файлов по шаблону имени …
Прямой слеш /, указатель опций команд …
Двойная кавычка «, указатель начала и конца строки … Кавычки — также пытаются, в меру сил — подавлять специальные операторы внутри обозначенной текстовой строки … Помните про её недостаточность, в случае с амперсандом SET «a=^&» … Также, подмечено, что если ECHO, вместо ответа — указывает свой статус (режим Эха включен), то заключение выражения в кавычки — лишь подтвердит, что указанной команды, исполняемого файла или сценария — не существует ))) … Плохая команда, можно сказать ))) …
Сами себя экранируют …
% экранирует %, и по мере возможности пытается экранировать некоторые управляющие символы, не разделённые пробелом …
! экранирует ! переменные в режиме SETLOCAL локального включения расширений функциональности команд интерпретатора CMD и разрешение отложенного раскрытия переменных … Отложенное (ленивое) раскрытие переменных EnableDelayedExpansion означает, что переменные будут раскрываться — не в момент выполнения команды, а в момент ее переопределения — в текущий момент времени…
И, уже известный ^ экранирует ^ …
Также отмечается, что если в переменную нужно внести значение с первым знаком равно =TestValue, то оно должно экранироваться нижним подчёркиванием, что вообще — совершенно неочевидно ))) … _=TestValue … По этой же причине — категорически не рекомендуется называть имена переменных — начиная с символа _ нижнего подчёркивания …
Раздел computer : список всех страниц …
All DOS versions interpret certain characters before executing a command.
Some well know examples are the percent sign ( %
), and the redirection symbols ( < | >
).
Windows 95/98 and NT, and OS/2 too, also interpret double quotes ( "
) and ampersands ( &
), as shown in the Conditional Execution page.
In batch files, the percent sign may be «escaped» by using a double percent sign ( %%
).
That way, a single percent sign will be used as literal within the command line, instead of being further interpreted.
In Windows 95/98 and NT, and OS/2 too, redirection symbols may be escaped by placing them between double quotes ( ">"
).
However, the quotes themselves will be passed to the command too, unlike the double percent sign.
Windows NT and OS/2 also allow the use of carets ( ^
) to escape special characters.
Even linefeeds can be escaped this way, as is shown in the Useless Tips page.
If you intend to «nest» commands with escaped characters, you may need to escape the escape character itself too.
In general, that won’t make it any easier to read or debug your batch files, however.
Since the introduction of delayed variable expansion a new challenge is to escape exclamation marks, the «delayed» version of the percent sign.
Unlike percent signs, that can be escaped by doubling them, exclamation marks cannot be escaped by adding an extra exclamation mark.
Nor does a caret before the exclamation mark work, unless quoted (i.e. ECHO ^!
will fail to display an exclamation mark, whereas ECHO "^!"
will display a quoted exclamation mark: "!"
).
Jaime Ramos sent me this link where the solution can be found: use ^^!
.
The trick is that a single caret will be used to escape the exclamation mark in the first «pass» of command line interpretation, but delayed variable expansion adds a second «pass» where the exclamation mark will be interpreted.
If you don’t get it, never mind, just remember the double caret before the exclamation mark.
Using FIND to search files or standard output for a string containing doublequotes used to be a pain… I often used FINDSTR instead, in these cases.
Robert Cruz explained to me that in this particular case only you need to escape doublequotes by doublequotes, i.e. a single doublequote must be replaced by 2 doublequotes.
He also sent me this link on the subject.
Summary
Escape Characters | ||
---|---|---|
Character to be escaped | Escape Sequence | Remark |
% |
%% |
|
^ |
^^ |
May not always be required in doublequoted strings, but it won’t hurt |
& |
^& |
|
< |
^< |
|
> |
^> |
|
| |
^| |
|
' |
^' |
Required only in the FOR /F «subject» (i.e. between the parenthesis), unless backq is used |
` |
^` |
Required only in the FOR /F «subject» (i.e. between the parenthesis), if backq is used |
, |
^, |
Required only in the FOR /F «subject» (i.e. between the parenthesis), even in doublequoted strings |
; |
^; |
|
= |
^= |
|
( |
^( |
|
) |
^) |
|
! |
^^! |
Required only when delayed variable expansion is active |
" |
"" |
Required only inside the search pattern of FIND |
\ |
\\ |
Required only inside the regex pattern of FINDSTR |
[ |
\[ |
|
] |
\] |
|
" |
\" |
|
. |
\. |
|
* |
\* |
|
? |
\? |
Unexpected behaviour of CALLs:
Try this demo batch file, it shows some results you may not have expected.
Always test when escaped strings have to be passed on to CALLed commands.
@ECHO OFF IF "%~1"=="" ( CLS ECHO Demo script showing how CALL adds its own caret escape characters to arguments ECHO. ECHO Note the loss of the percent sign even when doublequoted ECHO Command : ECHO "%%A^(" ECHO Expected output : "%%A^(" ECHO Actual output : "%A^(" ECHO. ECHO Command : ECHO %%A^^( ECHO Expected output : A^( ECHO Actual output : %A^( ECHO. ECHO Command: CALL :Subroutine "%%A^(" CALL :Subroutine "%A^(" ECHO Command: CALL "%%~f0" "%%A^(" CALL "%~f0" "%A^(" ECHO. ) ELSE ( ECHO. ECHO Start of rerun, note the automatically added escape characters and loss of percent signs ECHO Command : ECHO "%%~1" ECHO Expected output : "%%A^(" ECHO Actual output : "%~1" ECHO. ECHO Command: ECHO.%%~1 ECHO Expected output : A( ECHO Actual output : %~1 ECHO End of rerun ECHO. ) GOTO:EOF :Subroutine ECHO. ECHO Start of Subroutine, note the automatically added escape characters and loss of percent signs ECHO Command : ECHO "%%~1" ECHO Expected output : "%%A^(" ECHO Actual output : "%~1" ECHO. ECHO Command : ECHO.%%~1 ECHO Expected output : A( ECHO Actual output : %~1 ECHO End of Subroutine ECHO. GOTO:EOF
The script above will generate the output shown below:
Demo script showing how CALL adds its own caret escape characters to arguments Note the loss of the percent sign even when doublequoted Command : ECHO "%A^(" Expected output : "%A^(" Actual output : "A^(" Command : ECHO %A^( Expected output : A( Actual output : A( Command: CALL :Subroutine "%A^(" Start of Subroutine, note the automatically added escape characters and loss of percent signs Command : ECHO "%~1" Expected output : "%A^(" Actual output : "A^^(" Command : ECHO.%~1 Expected output : A( Actual output : A^( End of Subroutine Command: CALL "%~f0" "%A^(" Start of rerun, note the automatically added escape characters and loss of percent signs Command : ECHO "%~1" Expected output : "%A^(" Actual output : "A^^(" Command: ECHO.%~1 Expected output : A( Actual output : A^( End of rerun
page last modified: 2019-11-19; loaded in 0.0015 seconds
Содержание
- 1 Пробелы в значениях переменных
- 2 Разрыв строки текста, перенос строки команд
- 3 Экранирование служебных спецсимволов
Пробелы в значениях переменных
С переменной, в значении которой есть один или несколько пробелов, можно работать как и обычно..
Set PathBase=c:\Program Files\Firefox Set StartProcess=%PathBase%\Firefox.exe
Но не всегда это работает и в тех случаях, когда по синтаксису пробел не должен находиться в этом месте, тогда используют обрамляющие кавычки
Set PathBase=c:\Program Files\Firefox echo "%PathBase%\profiles.ini"
Но в некоторых случаях и тот и тот вариант может не подойти, тогда уж наверняка вас выручит иной вариант с кавычками, мой любимый
Set "PathBase=c:\Program Files\Firefox" echo %PathBase%\profiles.ini
Разрыв строки текста, перенос строки команд
Если текст вашей команды слишком длинный, то это делает сценарий менее наглядным и удобочитаемым. Символ ^ должен быть последним в строке и означает, что следующая строка является продолжением текущей. Возможно разбиение команд более, чем на две строки. Заметим, при печати в консоли на выходе будет все же одна строка. Данный способ применяется только для более удобного восприятия и форматирования длинного кода листинга.
echo ^ Этот способ работает^ не только для текста^ но и для команд
Если нужно сделать перенос печатаемого текста в самой консоли, то просто используется новая команда с новой строки echo ваш текст.
Если нужна пустая строка на выходе, то используйте команду echo с точкой, то есть echo. в консоли выведет пустую строку.
Экранирование служебных спецсимволов
В командном языке Windows существует некоторый набор символов с высоким приоритетом, которые всегда трактуются как спецсимволы. К ним, в частности, относятся:
- Операторы перенаправления ввода-вывода <, >, >>.
- Оператор конвейера |.
- Операторы объединения команд ||, & и &&.
- Оператор разыменования переменной %…%.
В случае со знаком процента решение довольно хорошо известно и состоит в удвоении этого символа. Для других символов тут нам и придет на помощь уже известный знак домика — символ ^.
:: Это не сработает, вызовет ошибку - > was unexpected at this time. echo <html> :: А это сработает echo ^<html^>
Этим же символом домика можно экранировать и любой другой символ, включая самого себя.
Продолжение следует..
How to escape character as literal string in command line or batch fil programming..
In DOS scripting or commands, certain characters such as \
and /
need to be displayed as part of a literal string. These special characters have meanings that differ from normal literal characters. Therefore, to include them in a string, you need to escape them.
In DOS, the ^
character is used as an escape character to indicate that the following character should be treated as a literal character.
For example, consider the following strings that contain special characters:
echo <p>
echo hello!
echo first > second
echo first & second
echo first< second
echo first | second
In the above example, <
, >
, &
, |
, and !
are special characters with specific meanings. Using them directly with echo will not yield the raw string.
General Escape Character (caret)
The ^
character is used to escape characters in Batch and command line scripts.
echo ^<p^>
echo hello^!
echo first ^> second
echo first ^& second
echo first ^< second
echo first ^| second
for example
For example, echo first ^<
second will print first <
second. This escaping mechanism also works for HTML strings.
Incase if you enable double
- Escaping Ampersand in Batch Script
The &
character is special and has a unique meaning to separate commands. For instance, echo first & second
would be treated as two separate commands.
E:\>echo first &second
first
'second' is not recognized as an internal or external command,
operable program or batch file.
To avoid that use escape character &
used with ^
character in batch or command line script.
echo first ^&second
Alternatively, you can use double-quoted strings without the caret
echo "first &second"
- Escaping Percentage (%) Character
Sometimes, the %
character needs to be treated as a literal character. In such cases, it must be escaped with a caret.
echo 1110%
After escape characters, The line is
echo 111^%
- Escaping Directory Paths Containing Spaces
When dealing with folder names containing spaces, you must escape the space to treat it as part of the literal string.
dir my dir
space escaped using caret
dir my^ dir
- Escaping Redirection Operators
Redirection operators <
and >
have special meanings. To include them as part of the literal string, you need to escape them.
echo first ^< second ^> third
which outputs first < second > third
- Escaping Piping Operators (|)
The piping operator |
has a special meaning, indicating that the output of one command serves as input to another command.
echo first | second
which outputs first as input to second
to display as a literal string
echo first ^| second
Batch other escape characters
Some more characters(Asterisk, Question mark, Exclamatory mark, Backslash) characters escaped wih lcaret to display as a literal string.
echo first ^* REM Escaping Asterisk
echo first ^? REM Escaping Question Mark
echo first ^! REM Escaping Exclamatory Mark
echo first ^\ REM Escaping Backslash Character