web-dev-qa-db-fra.com

Fichier batch pour les boucles - plusieurs lignes

Pourquoi les lignes suivantes fonctionnent-elles dans un fichier batch?

 for  %%a in ("C:\Test\*.txt") do set FileName=%%~a
 echo Filename is: %FileName%

Mais ce ne sera pas le cas?:

 for  %%a in ("C:\Test\*.txt") do (
     set FileName=%%~a
     echo Filename is: %FileName%
 )

C'est comme si la variable "a" n'était pas conservée sur la deuxième ligne. Pourquoi cela et comment utiliser le contenu de "a" comme dans le deuxième exemple?

23
Ekins86

C'est parce que tout ce qui se trouve entre les parenthèses est chargé sur une seule ligne. Donc %FileName% est développé (au moment du chargement) avant d'être défini (au moment de l'exécution). Si vous devez utiliser le deuxième format, vous devez activer l'expansion différée. Vous aurez alors des difficultés si le nom de fichier contient un !. Cela fonctionnerait s'il n'y avait pas de parenthèses dans les noms de fichiers.

 setlocal enabledelayedexpansion
 for  %%a in ("C:\Test\*.txt") do (
     set FileName=%%~a
     echo Filename is: !FileName!
 )
28
RGuggisberg