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


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

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

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

2 59

2 ответа:

(объяснение более подробно можно найти в архив базы знаний Майкрософт, в статье.)

три вещи, чтобы знать:

  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

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

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