У Windows Explorer, чому ми можемо створити папку або файл з символом відсотка (%), якщо символ відсотка використовується для існуючих змінних?


13
  1. Перейдіть до Провідника Windows і створіть папку / каталог з ім'ям %systemdrive%, %windir%або будь-якої іншої існуючої змінної.
  2. Відкрийте командний рядок і перейдіть до створеної папки.

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

Відхилення відсотків ( % ) символ з двома відсотками відсотків ( %% ) не працює, тому відповідь DavidPostill неправильна:

Command prompt window, with a bit of the Explorer desktop showing Отже, у Windows Explorer, чому ми можемо створити папку або файл із відсотками ( % ) символ, символ відсотка використовується для існуючих змінних?

Відповіді:


15

Чому ми можемо створити папку / файл з символом відсотка?

The % символ не є зарезервованим символом у назві файлу.

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

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

Втеча проц

The % Символ має спеціальне значення для параметрів командного рядка і FOR параметри.

Щоб вважати відсоток звичайним символом, подвійне значення:

%%

Джерело синтаксис


Подальше читання


1
Примітка: не всі зарезервовані символи застосовуються до файлової системи NTFS. Використовуючи Linux, наприклад, я можу легко створити файл з ім'ям <test>. Це просто неможливо зробити за допомогою функцій керування файлами Windows.
Nathan Osman

2
@NathanOsman Можливо, ви зможете створювати файли з такими іменами зсередини Windows, використовуючи абсолютну нотацію шляху ( \\?\C:\USERS\DEFAULT\<test> ).
zwol

@zwol о? Я цього не знав. Це добре знати.
Nathan Osman

@zwol Не з cmd оболонка ... F:\test>md \\?\f:\test\<test> Синтаксис команди неправильний.
DavidPostill

@DavidPostill Про що md \\^?\f:\test\^<test^> ?
zwol

11

Відповідь Давида Постілла велика, але може трохи заплутати новоприбулих. Я спробую перефразовувати.

% не є зарезервований характер.

Це символ з особливе значення до командна оболонка (ака cmd.exe і command.com )

Різниця:

  • взагалі не можна використовувати зарезервовані символи (але див. нижче)
  • можливо, ви зможете використовувати спеціальні символи та символи виходу - просто не вводячи їх як є

Іншими словами, можна створити файл або папку, що містить % від їх імені. Ви можете зробити це безпосередньо за допомогою Windows Explorer, тому що % тут немає особливого значення. Не було жодного наміру перешкодити вам створювати такі файли в командному рядку, але тому % має особливе значення там, вам потрібно використовувати синтаксис, описаний нижче, щоб створити такі файли.

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 тут не працює).

% не є єдиним символом зі спеціальним значенням у командному рядку. Інші включають ^, <, >, |, (, ), &, !, ". Більшість з них (за винятком " ) може бути втік - тобто, з префіксом символу втечі ^ так що вставляється буквальний символ, пригнічуючи його особливе значення. Вони також втрачають свою особливу функцію всередині подвійногокотированого рядка, і " відображається зі зворотною слеш: \". Деякі кари ( ^ ), може знадобитися подвоїти всередині рядка з подвійним цитатою, а там, де відбувається заміщення змінної змінної ! особливе значення).

Командний рядок

На жаль, при наборі команд у вікно командного рядка безпосередньо, подвоєння % характер просто виробляє %% вищезгаданий підхід не працює в цьому випадку.

Схоже, існує обхідний шлях, який використовує приховування в обробці команд - ви можете отримати літерал % набравши ^ після %. Такий підхід не є надійним: якщо ваше ім'я файлу укладено у подвійні лапки, ^ інтерпретується буквально (і не видаляється як без лапок)

  • команду 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) може таким чином створювати (і видаляти) імена файлів / каталогів, з якими більшість нормальних функцій API Windows (і, отже, програми Windows) не можуть працювати. На Windows XP робота з ними була можлива шляхом встановлення безкоштовної "Підсистеми послуг для Unix" (SFU); на Vista і вище сторонніх інструментів, необхідні для цього. Я не впевнений, що нова підсистема ubuntu-on-windows10 може це зробити.


Чому ви використовуєте теги клавіатури для імен шляхів / команд? Це було б як синтаксично більш правильним, так і читабельним, якщо ви просто використали форматування вбудованого коду. Також було б легше вводити: backtick замість <kbd>.
Cody Gray

зроблено. Я вважаю, що & lt; kbd & gt; теги & lt; / kbd & gt; мав набагато більш чіткий контур code blocks. Але якщо виникло таке питання, то, мабуть, вони викликають плутанину.
Jack White

2
"Це символ втечі командного оболонки" Неправильно. Символ у cmd є ^. % це "символ, який має спеціальне значення для параметрів командного рядка і параметрів FOR.
DavidPostill

Дійсно, я переплутав терміни. Тепер виправили відповідь. Дякую.
Jack White

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