2011-11-20 5 views
1

Je veux faire un fichier batch, ce qui ferait moi heureux une longue chaîne de tous les noms de fichiers dans le répertoire.Fichier de fusion pour fusionner les noms de fichiers dans une chaîne ne fonctionne pas

J'ai donc un répertoire:

-docA.pdf 
-docB.pdf 
-docC.pdf 

Et je veux avoir une chaîne comme ceci:

docA.pdf docB.pdf docC.pdf

Dans un en gros: http://bit.ly/u1eAHO

Chemin long: J'ai écrit un script

@echo off 
pushd "%~dp0" 
set "FILE_LIST=pre_" 

FOR /F "tokens=*" %%i IN ('DIR /A:-D /B') DO (
     IF NOT %%i==%~nx0 (              
       echo %%i 

       set "FILE_LIST=%FILE_LIST%%%i" 
       echo %FILE_LIST%             
     ) 
    ) 

echo %FILE_LIST% 
pause 

Et cette sortie obtenir:

docA.pdf 
pre_ 

docB.pdf 
pre_ 

docC.pdf 
pre_ 

pre_docC.pdf 

Pourquoi? Comment puis-je obtenir le bon?

Répondre

2

Il s'agit d'un problème assez connu avec les fichiers batch. La réponse courte est que les fichiers batch sont exécutés en développant les variables dans une ligne avant de les exécuter. Pour les blocs multilignes (le contenu entre parenthèses), toutes les variables non-boucle sont développées une fois, puis la boucle est exécutée. Votre corps de la boucle est essentiellement:

IF NOT %%i==%~nx0 (
    echo %%i 
    set "FILE_LIST=pre_%%i" 
    echo pre_ 
) 

Ils ont ajouté une fonctionnalité appelée delayed expansion quelque part le long du chemin (NT4 IIRC) que vous pouvez activer dans le registre ou via une déclaration SETLOCAL. Changez votre script à quelque chose comme:

@echo off 
setlocal EnableDelayedExpansion EnableExtensions 
pushd "%~dp0" 
FOR /F "tokens=*" %%i IN ('DIR /A:-D /B') DO (
    IF NOT %%i==%~nx0 (              
     set "FILE_LIST=!FILE_LIST!%%i" 
    ) 
) 
echo %FILE_LIST% 
endlocal 
pause 

et cela devrait fonctionner. Je suis loin de ma boîte de Windows jusqu'à lundi, mais cela devrait être assez proche. Si vous rencontrez des problèmes, lisez l'aide affichée en tapant FOR /? et SETLOCAL /? dans une invite de commande.

+0

Merci beaucoup pour votre commentaire. Je pense que cela va résoudre le problème. Mais mon dieu, ils auraient dû le changer depuis longtemps. Ça ne marche pas, mais j'ai l'idée. Je vais tester dès que je reviendrai sur ce projet. –

Questions connexes