Яка різниця між% та %% у файлі cmd?


87

Нещодавно я включив рядок, подібний до цього, у файл .cmd:

for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"

Спочатку я використовував лише% f, і він буде нормально працювати при запуску в командному рядку, але не при запуску через файл. Коли я перейшов на %% f, він працював у файлі. Просто цікаво, в чому різниця.

Відповіді:


136

(Більш детально роз’яснення можна знайти в заархівованій статті Microsoft KB .)

Три речі, які слід знати:

  1. Знак відсотка використовується в пакетних файлах для представлення параметрів командного рядка: %1, %2, ...
  2. Двовідсоткові знаки з будь-якими символами між ними інтерпретуються як змінна:

    echo %myvar%

  3. Два відсоткові знаки, у яких немає нічого між ними (у пакетному файлі), розглядаються як єдиний відсотковий знак у команді (а не в командному файлі):%%f

Чому це?

Наприклад, якщо ми виконаємо ваш (спрощений) командний рядок

FOR /f %f in ('dir /b .') DO somecommand %f

у пакетному файлі правило 2 намагається інтерпретувати

%f in ('dir /b .') DO somecommand %

як змінну. Щоб запобігти цьому, вам слід застосувати правило 3 і втекти %з другого %:

FOR /f %%f in ('dir /b .') DO somecommand %%f

21
Чи є пояснення, чому я можу уникнути, використовуючи лише один відсоток знаку в циклі FOR, коли він виконується безпосередньо з командного рядка, а не з командного файлу? Я знаю про спадщину DOS, але зараз ми можемо використовувати змінні з командного рядка.
Алек Мев,

6
Крім того, переконайтеся, що змінна має один символ.
jiggunjer 02

1
Що робити, якщо я хочу видати команду, в якій є%, наприклад: for / f %% i in ('git log -1 --pretty = format: "%% H"') do set GIT_COMMIT = %% i
Wakan Tanka

15

У DOS ви не могли використовувати змінні середовища в командному рядку, лише в командних файлах, де вони використовували %знак як роздільник. Якщо ви хотіли буквальний %знак у пакетному файлі, наприклад, у echoвиписці, вам потрібно було його подвоїти.

Це було перенесено на Windows NT, що дозволило змінні середовища в командному рядку, однак для зворотної сумісності вам все одно потрібно подвоїти ваші %знаки у файлі .cmd.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.