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

J’ai récemment ajouté 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 fonctionnerait bien sur une ligne de commande, mais pas sur le fichier. Lorsque je suis passé à %% f, cela a fonctionné dans le fichier. Je me demande quelle est la différence.

(Une explication plus détaillée peut être trouvée dans un article archivé de Microsoft KB .)

Trois choses à savoir:

  1. Le signe de pourcentage est utilisé dans les fichiers de commandes pour représenter les parameters de la 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 % 

en tant que variable. Pour éviter cela, vous devez appliquer la règle 3 et échapper au % avec un deuxième % :

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

Sous DOS, vous ne pouviez pas utiliser les variables d’environnement sur la ligne de commande, uniquement dans les fichiers de commandes, où ils utilisaient le signe % comme délimiteur. Si vous souhaitez un signe % littéral dans un fichier de commandes, par exemple dans une déclaration echo , vous devez le doubler.

Cela a été transféré à Windows NT qui autorisait les variables d’environnement sur la ligne de commande, mais pour la compatibilité ascendante, vous devez toujours doubler vos signes % dans un fichier .cmd.