Ответ Дэвида Постилла великолепен, но может немного смутить новичков. Я постараюсь перефразировать.
%
не является зарезервированным символом
Это символ, имеющий особое значение для командной оболочки (он же cmd.exe
и command.com
)
Разница в том, что:
- Вы не можете использовать зарезервированные символы вообще (но смотрите ниже)
- Вы можете использовать специальные и escape-символы - только не набирая их как есть
Другими словами, вы можете создать файл или папку, содержащую %
в своем имени. Вы можете сделать это напрямую, используя проводник Windows, потому %
что там нет особого значения. Также не было намерения помешать вам создавать такие файлы в командной строке, но, поскольку они %
имеют особое значение, вам необходимо использовать синтаксис, описанный ниже, для создания таких файлов.
BAT-файлы
Если вы пишете командный файл (* .bat, * .cmd), который исполняется с помощью командной оболочки (или приложение командной строки), использовать %
буквально (например, для создания файла с %
именем, а не для замены). переменная или параметр) вы должны ввести %%
вместо этого.
Например,
- Команда
echo %windir%
производит вывод:c:\windows
- однако, команда
echo %%windir%%
производит вывод:%windir%
- и так далее: команда
echo %%%%windir%%%%
производит вывод:%%windir%%
Поэтому, если вы сохраните следующую строку как test.bat
и запустите ее, она создаст каталог %test%
с полными знаками процента:
md %%test%%
Если нет не переменная с именем test
, эта следующая команда эквивалентна последней - она также создает каталог %test%
:
md %test%
... но никогда не делайте так, потому что ваша команда не будет вести себя так, как вы хотели, когда кто-то создаст переменную с таким именем
Если вы намереваетесь использовать команду for
в BAT-файле, вам также нужно удвоить значение, %
чтобы оно имело особое значение для for
команды вместо самой командной оболочки:
for %%i in (*.*) do echo %%i
Это создаст список файлов в текущем каталоге (то есть %%i
имеет особое значение), и я не уверен, как заставить его создавать литералы, %%i
не прибегая к %p%
обходному пути, описанному в следующем разделе ( %%%%i
здесь не работает).
%
это не единственный символ со специальным значением в командной строке. Другие включают в себя ^
, <
, >
, |
, (
, )
, &
, !
, "
. Большинство из них (исключая "
) могут быть экранированы, то есть с префиксом escape-символа, ^
так что вставляется буквальный символ, подавляя его особое значение. Те же теряют свою особую функцию внутри doublequoted строки, и "
является символом обратной косой черты: \"
. Некоторые carets ( ^
) может потребоваться удвоить внутри строки, заключенной в двойные кавычки, и там, где имеет место отложенная замена переменных ( !
особое значение).
Командная строка
К сожалению, при вводе команд непосредственно в окно командной строки, удваивающий %
символ просто производит, %%
т.е. вышеупомянутый подход не работает в этом случае.
Кажется, есть обходной путь, использующий причуду в обработке команд - вы можете получить буквальное значение %
, набрав ^
после %
. Этот подход не является надежным: если ваше имя файла заключено в двойные кавычки, ^
интерпретируется буквально (и не удаляется как без кавычек)
- Команда
echo %windir%
производит вывод:c:\windows
- Команда
echo %^windir%
производит вывод:%windir%
- Команда
echo "%^windir%"
производит вывод: "%^windir%"
(с дополнительным ^
- не то, что мы хотели)
Я рекомендую другой обходной путь вместо этого:
- создайте переменную как это:
set "p=%"
- используйте
%p%
везде, где вам нужен буквальный знак процента: echo "%p%windir%p%"
теперь будет выводиться:"%windir%"
Тот же обходной путь можно использовать для получения буквального знака процента в for
команде, однако обратите внимание, что в отличие от BAT-файлов при for
непосредственном вводе команды вы не удваиваете знаки процента.
Файловая система зарезервированных символов
Обычно вы не можете создать файл или каталог, содержащий в своем имени следующие зарезервированные символы:, /
?
<
>
\
:
*
|
"
NULL-символ и символы с кодами от 1 до 31; также .
и пробел не может быть последним символом; и следующие названия являются незаконными: com1
com2
com3
com4
com5
com6
com7
com8
com9
lpt1
lpt2
lpt3
lpt4
lpt5
lpt6
lpt7
lpt8
lpt9
con
nul
prn
.
Тем не менее, некоторые из этих ограничений можно обойти предваряя путь к файлу с \\?\
так: \\?\c:\test...\nul
. Таким образом можно манипулировать, по крайней мере, файлами с зарезервированными именами и теми, которые заканчиваются пробелом и точкой.
Более того, файловая система NTFS сама поддерживает несколько подсистем имен: DOS, Windows и POSIX. Это подсистема Windows, которая имеет все ограничения, указанные выше, в то время как POSIX только запрещает /
и NULL-символ.
Таким образом, ОС GNU / Linux (расширенный набор POSIX) может создавать (и удалять) имена файлов / каталогов, с которыми большинство обычных функций Windows API (и, следовательно, программ Windows) не могут работать. На Windows XP работать с ними можно было, установив бесплатную «Службу для Unix подсистемы» (SFU); на Vista и выше для этого требуются сторонние инструменты. Я не уверен, что новая подсистема ubuntu-on-windows10 может это сделать.
<test>
. Это просто невозможно сделать с помощью функций управления файлами Windows.