Ответ Дэвида Постилла великолепен, но может немного смутить новичков. Я постараюсь перефразировать.
%
не является зарезервированным символом.
Это символ, имеющий особое значение для командной оболочки (aka cmd.exe
и command.com
)
Разница в том, что:
- Вы не можете использовать зарезервированные символы вообще (но смотрите ниже)
- Вы можете использовать специальные и escape-символы - только не набирая их как есть
Другими словами, вы можете создать файл или папку, содержащую %
в их имени. Вы можете сделать это непосредственно с помощью окна проводника , потому %
не имеет особого значения там. Также не было намерения помешать вам создавать такие файлы в командной строке, но, поскольку %
имеет там особое значение, вам нужно использовать синтаксис, описанный ниже, для создания таких файлов.
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-символа ^
так что вставляется буквальный символ, подавляя его особое значение. Они также теряют свою специальную функцию внутри строки в двойных кавычках, и "
экранируется обратной косой чертой: \"
. Некоторые символы (^
), возможно, должны быть удвоены внутри строки, заключенной в двойные кавычки, и там, где имеет место отложенная замена переменных (!
особое значение).
Командная строка
К сожалению, при вводе команд непосредственно в окне командной строки, удвоение символа %
просто приводит к %%
т. Е. Вышеупомянутый подход не работает в этом случае.
Кажется, есть обходной путь, использующий причуду в обработке команд - вы можете получить буквальный %
, набрав ^
после %
. Однако такой подход не является надежным: если ваше имя файла заключено в двойные кавычки, ^
интерпретируется буквально (а не удаляется как без кавычек)
- команда
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 может это сделать.