В чем разница между % и %% в файле cmd?
недавно я включил строку, похожую на эту в a .файл cmd:
for /f %%f in ('dir /b .directory*.sql') DO sqlcmd -b -o ".directoryoutput%%f.txt" -i ".directory%%f"
Первоначально я использовал только %f, и он будет работать нормально при запуске в командной строке, но не при запуске через файл. Когда я переключился на %%f, он работал в файле. Просто интересно, в чем разница.
2 ответа:
(объяснение более подробно можно найти в архив базы знаний Майкрософт, в статье.)
три вещи, чтобы знать:
- знак процента используется в пакетных файлах для представления параметров командной строки:
%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
в DOS вы не могли использовать переменные среды в командной строке, только в пакетных файлах, где они использовали
%
знак в качестве разделителя. Если вы хотели литерал%
войти в пакетный файл, например вecho
заявление, вам нужно было удвоить его.это перенесено на Windows NT, который разрешил переменные среды в командной строке, однако для обратной совместимости вам все равно нужно удвоить
%
знаки в a .файл cmd.