В чем разница между% и %% в файле 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 .)

Следует знать три вещи:

  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"') установить GIT_COMMIT = %% i
Wakan Tanka
15

В DOS вы не могли использовать переменные среды в командной строке, только в пакетных файлах, где они использовали %знак в качестве разделителя. Если вам нужен буквальный %знак в пакетном файле, например, в echoоператоре, вам нужно его удвоить.

Это было перенесено в Windows NT, которая позволяла использовать переменные среды в командной строке, однако для обратной совместимости вам все равно нужно удвоить ваши %знаки в файле .cmd.

Нил
источник