Подтвердить что ты не робот

В чем разница между% и %% в файле cmd?

Недавно я включил строку, похожую на нее в файле .cmd:

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

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

4b9b3361

Ответ 1

(Более подробное объяснение можно найти в архивированной статье 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

Ответ 2

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

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