В проводнике Windows, почему мы можем создать папку или файл с символом процента (%), если символ процента используется для существующих переменных?
13
Перейти к Windows Explorer, и создать папку / директорию с именем %systemdrive%, %windir%или любой другой существующей переменной.
Откройте командную строку и перейдите в папку, которую вы только что создали.
Вы не можете этого сделать, поскольку %в имени папки есть символы процента ( ), что приводит к путанице в командной строке, поскольку символ процента используется для существующих переменных.
Экранирование %символа процента ( ) с двумя символами процента ( %%) не работает, поэтому ответ DavidPostill неверен:
Итак, в проводнике Windows, почему мы можем создать папку или файл с %символом процента ( ), если символ процента используется для существующих переменных?
Примечание: не все зарезервированные символы применяются к файловой системе NTFS. Например, используя Linux, я могу легко создать файл с именем <test>. Это просто невозможно сделать с помощью функций управления файлами Windows.
Натан Осман
2
@NathanOsman Вы можете создавать файлы с такими именами из Windows, используя необработанную запись абсолютного пути ( \\?\C:\USERS\DEFAULT\<test>).
zwol
@zwol, о? Я этого не знал. Это хорошо знать.
Натан Осман
@zwol Не из cmdоболочки ... F:\test>md \\?\f:\test\<test> Синтаксис команды неверен.
DavidPostill
@DavidPostill Как насчет md \\^?\f:\test\^<test^>?
zwol
11
Ответ Дэвида Постилла великолепен, но может немного смутить новичков. Я постараюсь перефразировать.
%не является зарезервированным символом
Это символ, имеющий особое значение для командной оболочки (он же 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; также .и пробел не может быть последним символом; и следующие названия являются незаконными: com1com2com3com4com5com6com7com8com9lpt1lpt2lpt3lpt4lpt5lpt6lpt7lpt8lpt9connulprn.
Тем не менее, некоторые из этих ограничений можно обойти предваряя путь к файлу с \\?\так: \\?\c:\test...\nul. Таким образом можно манипулировать, по крайней мере, файлами с зарезервированными именами и теми, которые заканчиваются пробелом и точкой.
Более того, файловая система NTFS сама поддерживает несколько подсистем имен: DOS, Windows и POSIX. Это подсистема Windows, которая имеет все ограничения, указанные выше, в то время как POSIX только запрещает /и NULL-символ.
Таким образом, ОС GNU / Linux (расширенный набор POSIX) может создавать (и удалять) имена файлов / каталогов, с которыми большинство обычных функций Windows API (и, следовательно, программ Windows) не могут работать. На Windows XP работать с ними можно было, установив бесплатную «Службу для Unix подсистемы» (SFU); на Vista и выше для этого требуются сторонние инструменты. Я не уверен, что новая подсистема ubuntu-on-windows10 может это сделать.
Почему вы используете теги клавиатуры для имен путей / команд? Это было бы синтаксически более правильно и более читабельно, если бы вы использовали встроенное форматирование кода. Также было бы легче напечатать: обратный удар вместо <kbd>.
Коди Грей
сделано. Я думал, что у <kbd> tags </ kbd> был намного более ясный план, чем code blocks. Но если такой вопрос возник, я думаю, что они вызывают путаницу.
Джек Уайт
2
«Это управляющий символ командной оболочки» Неправильно. Экранирующий символ в cmd есть ^. %это «символ, который имеет особое значение для параметров командной строки и параметров FOR. Чтобы рассматривать процент как обычный символ, удвойте его».
DavidPostill
Действительно, я перепутал условия. Теперь исправил ответ. Благодарю.
Джек Уайт,
Также обратите внимание, как указано в моем ответе, вы только дважды %в forслучае , что forнаходится внутри пакетного файла. Ввод for %%i in (*) do echo %%iв окно команды propmt приводит к ошибке, ссылаясь на неправильное появление %%i.
<test>
. Это просто невозможно сделать с помощью функций управления файлами Windows.\\?\C:\USERS\DEFAULT\<test>
).cmd
оболочки ...F:\test>md \\?\f:\test\<test>
Синтаксис команды неверен.md \\^?\f:\test\^<test^>
?Ответ Дэвида Постилла великолепен, но может немного смутить новичков. Я постараюсь перефразировать.
%
не является зарезервированным символомЭто символ, имеющий особое значение для командной оболочки (он же
cmd.exe
иcommand.com
)Разница в том, что:
Другими словами, вы можете создать файл или папку, содержащую
%
в своем имени. Вы можете сделать это напрямую, используя проводник Windows, потому%
что там нет особого значения. Также не было намерения помешать вам создавать такие файлы в командной строке, но, поскольку они%
имеют особое значение, вам необходимо использовать синтаксис, описанный ниже, для создания таких файлов.BAT-файлы
Если вы пишете командный файл (* .bat, * .cmd), который исполняется с помощью командной оболочки (или приложение командной строки), использовать
%
буквально (например, для создания файла с%
именем, а не для замены). переменная или параметр) вы должны ввести%%
вместо этого.Например,
echo %windir%
производит вывод:c:\windows
echo %%windir%%
производит вывод:%windir%
echo %%%%windir%%%%
производит вывод:%%windir%%
Поэтому, если вы сохраните следующую строку как
test.bat
и запустите ее, она создаст каталог%test%
с полными знаками процента:Если нет не переменная с именем
test
, эта следующая команда эквивалентна последней - она также создает каталог%test%
:... но никогда не делайте так, потому что ваша команда не будет вести себя так, как вы хотели, когда кто-то создаст переменную с таким именем
Если вы намереваетесь использовать команду
for
в BAT-файле, вам также нужно удвоить значение,%
чтобы оно имело особое значение дляfor
команды вместо самой командной оболочки:Это создаст список файлов в текущем каталоге (то есть
%%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 может это сделать.
источник
<kbd>
.code blocks
. Но если такой вопрос возник, я думаю, что они вызывают путаницу.^
.%
это «символ, который имеет особое значение для параметров командной строки и параметров FOR. Чтобы рассматривать процент как обычный символ, удвойте его».%
вfor
случае , чтоfor
находится внутри пакетного файла. Вводfor %%i in (*) do echo %%i
в окно команды propmt приводит к ошибке, ссылаясь на неправильное появление%%i
.