Ответ Дэвида Постилла великолепен, но может немного смутить новичков. Я постараюсь перефразировать.
%не является зарезервированным символом
Это символ, имеющий особое значение для командной оболочки (он же 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.