В проводнике Windows, почему мы можем создать папку или файл с символом процента (%), если символ процента используется для существующих переменных?


13
  1. Перейти к Windows Explorer, и создать папку / директорию с именем %systemdrive%, %windir%или любой другой существующей переменной.
  2. Откройте командную строку и перейдите в папку, которую вы только что создали.

Вы не можете этого сделать, поскольку %в имени папки есть символы процента ( ), что приводит к путанице в командной строке, поскольку символ процента используется для существующих переменных.

Экранирование %символа процента ( ) с двумя символами процента ( %%) не работает, поэтому ответ DavidPostill неверен:

Окно командной строки с небольшим количеством рабочего стола Explorer Итак, в проводнике Windows, почему мы можем создать папку или файл с %символом процента ( ), если символ процента используется для существующих переменных?

Ответы:


16

Почему мы можем создать папку / файл с символом процента?

Символ %не является зарезервированным символом в имени файла.

Зарезервированные символы для именования файлов, путей и пространств имен:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

Файлы имен источников , пути и пространства имен


Символ процента зарезервирован для переменных

Теперь откройте командную строку и попробуйте перейти в созданную вами папку.

Вы не можете, потому что в имени папки есть символы процента, указывающие, что это переменная.

Вышесказанное не соответствует действительности. Все работает так, как вы ожидаете.

Пример использования %test%:

F:\test>echo %test%
%test%

F:\test>md %test%

F:\test>cd %test%

F:\test\%test%>

Пример использования %systemdrive%:

F:\test>echo %systemdrive%
C:

F:\test>md %systemdrive%
A subdirectory or file C: already exists.

F:\test>cd %systemdrive%
C:\Users\DavidPostill

F:\test>c:

C:\Users\DavidPostill>f:

F:\test>

F:\test>dir %systemdrive%
 Volume in drive C has no label.
 Volume Serial Number is C8D0-DF1E

 Directory of C:\Users\DavidPostill

03/06/2016  16:16    <DIR>          .
03/06/2016  16:16    <DIR>          ..
18/07/2015  19:25    <DIR>          .atom
03/06/2016  16:16    <DIR>          .oracle_jre_usage
08/05/2015  20:29    <DIR>          Contacts
03/06/2016  16:14    <DIR>          Desktop
01/06/2016  09:04    <DIR>          Documents
02/05/2016  12:55    <DIR>          Downloads
09/01/2015  11:51    <DIR>          dwhelper
08/05/2015  20:29    <DIR>          Favorites
20/02/2016  22:00    <DIR>          Jaikoz
08/05/2015  20:29    <DIR>          Links
17/03/2015  06:19    <DIR>          Music
29/03/2016  19:01    <DIR>          Pictures
08/05/2015  20:29    <DIR>          Saved Games
23/06/2016  10:55    <DIR>          Searches
02/05/2016  12:36    <DIR>          SecurityScans
11/04/2016  12:14               994 Start Menu - Shortcut.lnk
31/05/2016  00:52    <DIR>          temp
17/03/2015  06:19    <DIR>          Videos
               1 File(s)            994 bytes
              19 Dir(s)  69,716,357,120 bytes free

Уходящие проценты

Символ %имеет особое значение для параметров командной строки и FORпараметров.

Чтобы считать процент обычным символом, удвойте его:

%%

Исходный синтаксис


Дальнейшее чтение


1
Примечание: не все зарезервированные символы применяются к файловой системе 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; также .и пробел не может быть последним символом; и следующие названия являются незаконными: 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>.
Коди Грей

сделано. Я думал, что у <kbd> tags </ kbd> был намного более ясный план, чем code blocks. Но если такой вопрос возник, я думаю, что они вызывают путаницу.
Джек Уайт

2
«Это управляющий символ командной оболочки» Неправильно. Экранирующий символ в cmd есть ^. %это «символ, который имеет особое значение для параметров командной строки и параметров FOR. Чтобы рассматривать процент как обычный символ, удвойте его».
DavidPostill

Действительно, я перепутал условия. Теперь исправил ответ. Благодарю.
Джек Уайт,

Также обратите внимание, как указано в моем ответе, вы только дважды %в forслучае , что forнаходится внутри пакетного файла. Ввод for %%i in (*) do echo %%iв окно команды propmt приводит к ошибке, ссылаясь на неправильное появление %%i.
Джек Уайт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.