2010-05-30 23 views
0

Pardonnez-moi si ce n'est pas le lieu de poser ces questions, je suis nouveau à batch et scripts et un peu nouveau à ce genre de messages ...Déplacer et renommer des fichiers, en conservant l'extension, mais inclure des sous-répertoires dans le fichier batch

J'ai un dossier qui recevra des fichiers et des dossiers, je veux exécuter un script qui regarde le répertoire et renomme numériquement tous les fichiers dans chaque sous-dossier, et les déplace si possible.

Par exemple, j'ai quelque chose qui ressemble à ce qui suit

Recieved_File_Folder 
    |_folder1 
    | |_file1.txt 
    | |_file2.bmp 
    |_folder2 
    | |_file4.exe 
    | |_file5.bmp 
    |__file9.txt 
    |__file10.jpg 

Je voudrais être en mesure de regarder dans tous les répertoires et le déplacer vers quelque chose comme ça, en gardant à l'esprit les noms des fichiers seront aléatoire et je veux garder l'extension intacte aussi.

Renamed_Folder 
    |_folder1 
    | |_1.txt 
    | |_2.bmp 
    |_folder2 
    | |_1.exe 
    | |_2.bmp 
    |__1.txt 
    |__2.jpg 

J'ai passé beaucoup de temps à ce sujet et je ne fais pas trop bien avec elle, toute aide serait très grandement apprécié !! Merci d'avance!

Répondre

1

Ce petit script devrait faire l'affaire:

@ECHO OFF 

SETLOCAL ENABLEDELAYEDEXPANSION 

FOR /F "tokens=1 delims=" %%A IN ('DIR /B /S /A:D') DO (

    SET /A FILE_COUNTER=1 

    FOR /F "tokens=1 delims=" %%B IN ('DIR /B /A:-D "%%A"') DO (
     CALL :RENAME "%%A%%B" !FILE_COUNTER! 
     SET /A FILE_COUNTER=FILE_COUNTER+1 
    ) 
) 

ENDLOCAL  
GOTO :EOF  

:RENAME 

SET OLD_PATH="%~f1" 
SET NEW_FILE_NAME="%2%~x1" 
REN %OLD_NAME% %NEW_NAME%  
GOTO :EOF 

Utilisez-le avec soin que le script ne vous demandera pas de confirmation, donc attention où vous commencez à partir!

Comment ça marche:

  • le premier FOR -loop répertorie tous les sous-répertoires récursive, en commençant par le répertoire en cours (en utilisant DIR /B /S /A:D) et passe le chemin complet du corps de la boucle via le la variable %%A
  • dans le premier corps de boucles est fixé un FILE_COUNTER variable à la valeur de 1
  • la seconde (interne) FOR -loop répertorie tous les fichiers dans le répertoire transmise par la boucle extérieure (à l'aide DIR /B /A:-D "%%A") et passe le chemin complet du fichier à son corps via la variable %%B
  • dans le corps de la boucle intérieure du :RENAME sous routine est appelée avec le dossier complet nommer la valeur FILE_COUNTER actuelle en tant que ses paramètres
  • la routine :RENAME sous utilise ses paramètres pour former le nouveau nom de fichier et émet une commande de changement de nom REN
  • après le retour sous routine, la valeur FILE_COUNTER actuelle est augmentée d'un (SET /A FILE_COUNTER=FILE_COUNTER+1)
+0

Frank, Merci beaucoup pour ça! Je n'ai pas utilisé le code exact que vous avez écrit bien que j'en ai utilisé la majeure partie et cela m'a beaucoup aidé! Très utile, merci beaucoup d'avoir pris le temps d'écrire ceci pour moi, c'est très apprécié. – Ser1esII

+0

Vous êtes les bienvenus. Si vous pensez qu'une réponse résout votre problème ou vous est utile, c'est une bonne habitude de l'accepter (cochez la case en dessous du titre). –