Windows Batch Script – Lit les noms de fichiers dans des variables

J’essaie de convertir des fichiers (films) dans un répertoire, un par un. Chaque nouveau fichier converti nécessite un nouveau nom de fichier, l’ancien portant une nouvelle extension.

J’ai essayé ci-dessous pour lire le fichier source, supprimer l’extension et en atsortingbuer une nouvelle:

@echo off setlocal DisableDelayedExpansion cd \target_dir for %%x in (*) do ( echo %%x set source=%%x echo Source #%source%# set target=%source:.mpg=% echo Target #%target%# transcode %source% %target%.mp4 ) 

Malheureusement, cela ne fonctionne pas. Comme le montre la sortie, je ne parviens même pas à copier le fichier actuel dans la variable “source”:

 E:\target_dir>..\test.bat movie1.mpg source ## target ## movie2.mpg source ## target ## 

J’ai cherché sur Google et pensé que j’avais trouvé la bonne syntaxe, mais cela ne semble pas être le cas. Merci pour toute aide!

jlahd montre une solution correcte sans copier le nom du fichier dans une variable.

Mais je veux expliquer votre problème actuel.

Comme le montre la sortie, je ne parviens même pas à copier le fichier actuel dans la variable “source”:

Vous avez trouvé le BBB (bogue de débutant par lot), en réalité vous définissez la variable mais vous n’avez pas réussi à accéder au contenu plus tard.

Ceci est un effet de l’parsingur par lots travaillant avec des blocs de code, car ces blocs sont analysés et le pourcentage d’expansion sera effectué avant l’exécution du code.
Un bloc de code est le code à l’intérieur des parenthèses ou des commandes concaténées par & , && ou || .

Pour éviter ce problème, l’expansion retardée a été introduite.
Alors vous pouvez simplement utiliser !variable! pour développer une variable à l’exécution.

 setlocal EnableDelayedExpansion cd \target_dir for %%x in (*) do ( echo %%x set source=%%x echo Source #!source!# set target=!source:.mpg=! echo Target #!target!# transcode !source! !target!.mp4 ) 

Cela marche:

 @echo off cd \target_dir for %%x in (*) do ( transcode "%%x" "%%~nx.mp4" ) 

Notez que vous ne pouvez pas utiliser la syntaxe %%~n sur les variables d’environnement standard – vous devez accéder directement à la variable for loop.

Edit: Ajout de citations pour que le traitement par lots fonctionne également avec des fichiers comportant des espaces.