Was ist der Unterschied zwischen% und %% in einer Cmd-Datei?

86

Ich habe kürzlich eine ähnliche Zeile in eine CMD-Datei eingefügt:

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

Ursprünglich hatte ich nur% f verwendet, und es würde gut funktionieren, wenn es in der Befehlszeile ausgeführt wird, aber nicht, wenn es durch die Datei ausgeführt wird. Als ich zu %% f wechselte, funktionierte es in der Datei. Ich frage mich nur, was der Unterschied ist.

Tyler
quelle

Antworten:

135

(Weitere Erläuterungen finden Sie in einem archivierten Microsoft KB-Artikel .)

Drei Dinge zu wissen:

  1. Das Prozentzeichen wird in Batch - Dateien verwendet , um Kommandozeilen - Parameter darstellen: %1, %2, ...
  2. Zwei Prozentzeichen mit Zeichen dazwischen werden als Variable interpretiert:

    echo %myvar%

  3. Zwei Prozentzeichen ohne irgendetwas dazwischen (in einer Batchdatei) werden wie ein einzelnes Prozentzeichen in einem Befehl behandelt (keine Batchdatei):%%f

Warum ist das?

Zum Beispiel, wenn wir Ihre (vereinfachte) Befehlszeile ausführen

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

In einer Batch-Datei würde Regel 2 versuchen, zu interpretieren

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

als Variable. Um dies zu verhindern, müssen Sie Regel 3 anwenden und %mit einer Sekunde entkommen %:

FOR /f %%f in ('dir /b .') DO somecommand %%f
marapet
quelle
21
Gibt es eine Erklärung dafür, warum ich nur ein Prozentzeichen in einer FOR-Schleife verwenden kann, wenn es direkt an einer Eingabeaufforderung und nicht aus einer Batchdatei ausgeführt wird? Ich kenne das DOS-Erbe, aber wir können jetzt Variablen über eine Befehlszeile verwenden.
Alec Mev
6
Stellen Sie außerdem sicher, dass die Variable ein einzelnes Zeichen ist.
Jiggunjer
1
Was ist, wenn ich einen Befehl ausgeben möchte, der% enthält, z. B.: Für / f %% i in ('git log -1 --pretty = format: "%% H"') setzen Sie GIT_COMMIT = %% i
Wakan Tanka
15

Unter DOS konnten Sie keine Umgebungsvariablen in der Befehlszeile verwenden, sondern nur in Batchdateien, in denen das %Zeichen als Trennzeichen verwendet wurde. Wenn Sie ein Literalzeichen %in einer Batchdatei wünschen, z. B. in einer echoAnweisung, müssen Sie es verdoppeln.

Dies wurde auf Windows NT übertragen, das Umgebungsvariablen in der Befehlszeile zuließ. Aus Gründen der Abwärtskompatibilität müssen Sie jedoch Ihre %Vorzeichen in einer CMD-Datei verdoppeln .

Neil
quelle