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

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

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

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

2 ответа2

15

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

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

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

< (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 .

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

%%

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


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

11

Ответ Дэвида Постилла великолепен, но может немного смутить новичков. Я постараюсь перефразировать.

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

Это символ, имеющий особое значение для командной оболочки (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 может это сделать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .