Jaka jest różnica między% a %% w pliku cmd?

88

Niedawno dołączyłem wiersz podobny do tego w pliku .cmd:

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

Początkowo używałem tylko% f i działałby dobrze, gdy byłby uruchamiany z wiersza poleceń, ale nie działałby po uruchomieniu pliku. Kiedy przełączyłem się na %% f, zadziałało w pliku. Zastanawiam się tylko, jaka jest różnica.

Tyler
źródło

Odpowiedzi:

138

(Wyjaśnienie bardziej szczegółowe można znaleźć w zarchiwizowanym artykule bazy wiedzy Microsoft ).

Trzy rzeczy, które należy wiedzieć:

  1. Procent znak jest używany w plikach wsadowych do reprezentowania parametry wiersza poleceń: %1, %2...
  2. Dwa znaki procentu z dowolnymi znakami między nimi są interpretowane jako zmienna:

    echo %myvar%

  3. Dwa znaki procentu bez niczego pomiędzy (w pliku wsadowym) są traktowane jak pojedynczy znak procentu w poleceniu (nie w pliku wsadowym):%%f

Dlaczego tak jest?

Na przykład, jeśli wykonamy (uproszczoną) linię poleceń

FOR /f %f in ('dir /b .') DO somecommand %f

w pliku wsadowym reguła 2 będzie próbowała zinterpretować

%f in ('dir /b .') DO somecommand %

jako zmienna. Aby temu zapobiec, musisz zastosować zasadę 3 i uciec %z sekundy %:

FOR /f %%f in ('dir /b .') DO somecommand %%f
marapet
źródło
21
Czy istnieje wyjaśnienie, dlaczego mogę uciec od używania tylko jednego znaku procentu w pętli FOR, gdy jest ona wykonywana bezpośrednio z wiersza polecenia, a nie z pliku wsadowego? Wiem o dziedzictwie DOS, ale mogą używać zmiennych z wiersza poleceń teraz.
Alec Mev
6
Upewnij się również, że zmienna jest pojedynczym znakiem.
jiggunjer
1
Co jeśli chcę wydać polecenie, które zawiera%, np .: for / f %% i in ('git log -1 --pretty = format: "%% H"') ustaw GIT_COMMIT = %% i
Wakan Tanka
15

W DOS nie można było używać zmiennych środowiskowych w linii poleceń, tylko w plikach wsadowych, w których używali %znaku jako separatora. Jeśli chciałeś mieć dosłowny %znak w pliku wsadowym, np. W echowyciągu, musiałeś go podwoić.

%Przeniesiono to do systemu Windows NT, który zezwalał na zmienne środowiskowe w wierszu poleceń, jednak w celu zachowania zgodności wstecznej nadal trzeba podwoić znaki w pliku .cmd.

Neil
źródło