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.

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

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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.