В чем разница между% и %% в файле cmd?
Недавно я включил строку, похожую на нее в файле .cmd:
for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"
Первоначально я использовал только% f, и он работал нормально, когда запускался в командной строке, но не при прохождении через файл. Когда я переключился на %% f, он работал в файле. Просто интересно, какая разница.
Ответы
Ответ 1
(Более подробное объяснение можно найти в архивированной статье Microsoft KB.)
Три вещи, которые нужно знать:
- Знак процента используется в пакетных файлах для представления параметров командной строки:
%1
, %2
,...
Два знака процента с любыми символами между ними интерпретируются как переменные:
echo %myvar%
- Два знака процента без чего-либо промежуточного (в пакетном файле) обрабатываются как один знак процента в команде (не в пакетном файле):
%%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.