2013-01-24 5 views
54

Niedawno zawarte wiersz podobny do tego w plik cmd:Jaka jest różnica między% i %% 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 to działa dobrze, gdy uruchamiane z linii poleceń, ale nie wtedy, gdy prowadzony przez plik . Po przełączeniu na %% f działało w pliku. Zastanawiam się, jaka jest różnica.

Odpowiedz

86

(. Wyjaśnienie więcej szczegółów można znaleźć w this Microsoft kb)

trzy rzeczy wiedzieć:

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

    echo %myvar%

  3. dwa procent znaki bez coś pomiędzy (w pliku wsadowym) są traktowane jak pojedynczy znak procent w komendzie (nie plik wsadowy): %%f

Czemu że?

Na przykład, jeśli mamy wykonać swój wiersz polecenia (uproszczony)

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

w pliku wsadowym, regułę 2 spróbuje zinterpretować

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

jako zmienna. W celu zapobieżenia, że ​​trzeba zastosować reguły 3 i uciec % z drugiej %:

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

Czy istnieje wytłumaczenie dlaczego mogę uciec z użyciem tylko jeden znak procent w pętli for, wykonywane bezpośrednio z wiersza poleceń, a nie z pliku wsadowego? Wiem o dziedzictwie DOS, ale ** możemy ** używać zmiennych z linii poleceń. –

+3

Upewnij się także, że zmienna jest pojedynczym znakiem. – jiggunjer

10

W systemie DOS nie można używać zmiennych środowiskowych w wierszu poleceń, tylko w plikach wsadowych, w których wykorzystano znak % jako ogranicznik. Jeśli chcesz mieć literalny znak % w pliku wsadowym, np. w oświadczeniu echo trzeba było podwoić.

Przeniesiono to do systemu Windows NT, który dopuszczał zmienne środowiskowe w wierszu poleceń, jednak aby uzyskać kompatybilność wsteczną, należy podwoić znaki % w pliku .cmd.

Powiązane problemy