Quelle est la différence entre% et %% dans un fichier cmd?

87

J'ai récemment inclus une ligne similaire à celle-ci dans un fichier .cmd:

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

À l'origine, je n'avais utilisé que% f, et cela fonctionnait bien lorsqu'il était exécuté sur la ligne de commande, mais pas lorsqu'il était exécuté dans le fichier. Lorsque je suis passé à %% f, cela fonctionnait dans le fichier. Je me demande juste quelle est la différence.

Tyler
la source

Réponses:

136

(Des explications plus détaillées peuvent être trouvées dans un article archivé de la base de connaissances de Microsoft .)

Trois choses à savoir:

  1. Le signe est utilisé pour cent dans des fichiers batch pour représenter les paramètres de ligne de commande: %1, %2, ...
  2. Deux signes de pourcentage avec des caractères entre eux sont interprétés comme une variable:

    echo %myvar%

  3. Deux signes de pourcentage sans rien entre les deux (dans un fichier de commandes) sont traités comme un signe de pourcentage unique dans une commande (pas un fichier de commandes):%%f

Pourquoi ça?

Par exemple, si nous exécutons votre ligne de commande (simplifiée)

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

dans un fichier batch, la règle 2 essaierait d'interpréter

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

comme variable. Pour éviter cela, vous devez appliquer la règle 3 et échapper %à une seconde %:

FOR /f %%f in ('dir /b .') DO somecommand %%f
marapet
la source
21
Y a-t-il une explication pour laquelle je peux m'en tirer en utilisant seulement un signe pour cent dans une boucle FOR, lorsqu'il est exécuté directement à partir d'une invite de commande, et non à partir d'un fichier de commandes? Je connais l'héritage DOS, mais nous pouvons maintenant utiliser des variables à partir d'une ligne de commande.
Alec Mev
6
Assurez-vous également que la variable est un seul caractère.
jiggunjer
1
Que faire si je veux émettre une commande qui contient%, par exemple: pour / f %% i in ('git log -1 --pretty = format: "%% H"') définissez GIT_COMMIT = %% i
Wakan Tanka
15

Sous DOS, vous ne pouviez pas utiliser de variables d'environnement sur la ligne de commande, uniquement dans les fichiers batch, où ils utilisaient le %signe comme délimiteur. Si vous vouliez un %signe littéral dans un fichier batch, par exemple dans une echoinstruction, vous deviez le doubler.

Cela s'est répercuté sur Windows NT qui autorisait les variables d'environnement sur la ligne de commande, mais pour la compatibilité descendante, vous devez toujours doubler vos %signes dans un fichier .cmd.

Neil
la source