Dispatch de fichiers dans les dossiers correspondants
RésoluBonjour,
J'aimerais que l'on m'aide à rédiger un script pour transférer des fichiers dans les dossiers correspondants.
Les nom de ces fichiers contiennent les noms de personnes et les dossiers sont aux noms de ces mêmes personnes.
Exemple :
Fichiers : Lettre Dupond.doc - CV Martin.pdf - Juarez Budget.xls
Dossiers : Dupond - Martin - Juarez ...
Les difficultés :
-les noms sont à des places aléatoires dans les noms des fichiers
-les fichiers sont dispersés dans des dossiers/sous-dossiers.
Je vous remercie d'avance pour votre aide
Windows / Edge 104.0.1293.54
15 réponses
L'objectif est d'automatiser le tri de fichiers dont les noms intègrent des noms de personnes, afin de les placer dans les dossiers correspondants, malgré des noms dispersés et variables. Les contributeurs ont discuté des défis comme la présence de noms en positions aléatoires dans les fichiers et la dispersion des documents dans des dossiers et sous-dossiers. Réponses ont évoqué des scripts qui reproduisent le tri par copies plutôt que suppression, avec vérification des doublons et option de réglage pour une correspondance plus stricte afin d'éviter les cas d'erreur. Des retours suggèrent d'uniformiser la convention de nommage, qu'environ 800 dossiers existent et que le script peut générer des duplications ou créer de nouveaux dossiers; une version ajustée est demandée.
-
Bonjour,
Il y a combien de personnes différentes ?
Est-ce qu'il faut créer les dossiers avec les noms des personnes ou bien ils sont déjà créés ?
-
Bonjour,
Il y a environ 800 dossiers au nom des personnes qui sont déjà créés.
Et peut-être une dizaine de fichiers (répartis dans des dossiers et sous dossiers) par personne à reclasser.
C'est tellement énorme, si vous pouviez m'aider ça m'éviterai des semaines de travail !
-
C'est Windows 10 Pro
Super merci !
-
Voilà j'ai terminé le script, je ne le poste pas directement car il est un peu trop long.
Voilà le lien pour le télécharger : https://www.cjoint.com/c/LHtlYNvcAdO
Une fois le fichier téléchargé il faudra le renommer en tri.cmd
Concernant le fonctionnement, dans un premier temps le script va vous demander le dossier à trier, puis dans un second temps il va demander le dossier contenant les sous-dossiers avec les noms des personnes. Ensuite le script n'a plus besoin de vous, il va travailler tout seul. A la fin du travail vous aurez droit à un récapitulatif succinct et vous pourrez consulter les opérations effectuées qui sont consignées dans un fichier texte portant la date et l'heure de chaque exécution du script.
Le script ne supprime aucun fichier, il se contente de faire des copies.
S'il y a plusieurs milliers de fichiers à traiter, le script peut prendre plusieurs dizaines de minutes, ne vous inquiétez pas.
Si vous avez des questions n'hésitez pas.
-
Je teste ça et je vous fait un retour.
Merci beaucoup !!
-
Mon ordinateur bloque le script car il craint des menaces sur les parties "folder" et "busy".
Mon service informatique ne m'autorise pas à l'executer car les 3 parties "Focus/Folder/Busy" sont cryptées ...
J'ai demandé à le tester sur une station blanche mais il semble qu'on n'en a pas !
Je ne sais pas quoi faire ....
Merci quand même pour l'aide. Je le testerai chez moi déjà.
-
-
@barnabe0057
Voilà je l'ai modifié, c'est nettement moins beau mais c'est fonctionnel :
@echo off mode con cols=140 lines=35 setlocal enableextensions enabledelayedexpansion ver | find "10.0." >nul && chcp 65001 >nul || chcp 1252 >nul color 0F : -------------------------------------------------------------------------------------- : on définit les variables : -------------------------------------------------------------------------------------- set "filtre=*.*" set "listeFichiers=%TMP%\liste_des_fichiers.txt" for /f "tokens=1,2,3 delims=/ " %%a in ('date /t') do set "maDate=%%c%%b%%a" for /f "tokens=1,2 delims=:" %%a in ('time /t') do set "heure=%%a%%b%time:~6,2%" set "log=%TMP%\tri_%maDate%_%heure%.txt" : -------------------------------------------------------------------------------------- : on choisit le dossier contenant les fichiers à trier : -------------------------------------------------------------------------------------- cls & echo. & echo ### Nom complet (chemin + nom) du dossier à trier : set /p dossierATrier=">>> " if not defined dossierATrier (exit /b 1) if not exist "%dossierATrier%" (exit /b 1) : -------------------------------------------------------------------------------------- : on choisit le dossier contenant les dossiers nominatifs : -------------------------------------------------------------------------------------- echo. & echo ### Nom complet (chemin + nom) du dossier parent contenant les dossiers des personnes : set /p dossierCible=">>> " if not defined dossierCible (exit /b 1) if not exist "%dossierCible%" (exit /b 1) : -------------------------------------------------------------------------------------- : on construit la liste des fichiers à trier : -------------------------------------------------------------------------------------- cd /d "!dossierATrier!" || exit /b 1 cls & echo. & echo Analyse du dossier en cours, merci de bien vouloir patienter quelques minutes ... dir /b /s /a-d %filtre% >"%listeFichiers%" : -------------------------------------------------------------------------------------- : on copie les fichiers correspondants au dossier nominatif : -------------------------------------------------------------------------------------- cd /d "!dossierCible!" || exit /b 1 set compteur=0 for /f "delims=" %%A in ('2^>nul dir /b /ad') do ( cls & echo. & echo ##### Dossier en cours de traitement : %%A echo. for /f "delims=" %%B in ('2^>nul findstr /i "%%A" "%listeFichiers%"') do ( set /a compteur+=1 echo. xcopy "%%~B" "%%~dpnA\" /c /y /l && echo "%%~B"?"%%~dpnA\">>"%log%" title Nombre de fichiers traités : !compteur! ) ) : -------------------------------------------------------------------------------------- : fin du script : -------------------------------------------------------------------------------------- set nbFichiersATraiter=0 for /f "delims=" %%A in ('type "%listeFichiers%"') do set /a nbFichiersATraiter+=1 cls & echo. & echo Résultat du tri : !compteur! fichiers effectivement traités echo. & echo Nombre de fichiers à trier (avant traitement) : %nbFichiersATraiter% fichiers echo. & echo. & pause explorer /select,"%log%" exit
-
-
J'ai pu le lancer merci beaucoup, c'est génial !!
Bravo pour le travail !
-
Bonjour barnabe0057,
J'ai pu lancer le script et il trie efficacement les fichiers. Par contre il ne les copie pas dans le dossier de destination :(
J'ai refait un test sur un fichier plus petit et on voit bien qu'il compare les fichiers aux dossiers mais il ne fait pas la copie dans ces dossiers ...
Je te remercie d'avance pour ta réponse
-
Super merci !
-
Voilà j'ai trouvé le problème, cela venait de l'utilisation du commutateur /L de la commande XCOPY qui simule une copie en affichant le nom des fichiers mais sans les copier réellement.
-
La version corrigée :
@echo off mode con cols=140 lines=35 setlocal enableextensions enabledelayedexpansion ver | find "10.0." >nul && chcp 65001 >nul || chcp 1252 >nul color 0F : -------------------------------------------------------------------------------------- : on définit les variables : -------------------------------------------------------------------------------------- set "filtre=*.*" set "listeFichiers=%TMP%\liste_des_fichiers.txt" for /f "tokens=1,2,3 delims=/ " %%a in ('date /t') do set "maDate=%%c%%b%%a" for /f "tokens=1,2 delims=:" %%a in ('time /t') do set "heure=%%a%%b%time:~6,2%" set "log=%TMP%\tri_%maDate%_%heure%.txt" : -------------------------------------------------------------------------------------- : on choisit le dossier contenant les fichiers à trier : -------------------------------------------------------------------------------------- cls & echo. & echo ^>^>^> Nom complet (chemin + nom) du dossier à trier : set /p dossierATrier=">>> " if not defined dossierATrier (exit /b 1) if not exist "%dossierATrier%" (exit /b 1) : -------------------------------------------------------------------------------------- : on choisit le dossier contenant les dossiers nominatifs : -------------------------------------------------------------------------------------- echo. & echo. & echo ^>^>^> Nom complet (chemin + nom) du dossier parent contenant les dossiers des personnes : set /p dossierCible=">>> " if not defined dossierCible (exit /b 1) if not exist "%dossierCible%" (exit /b 1) : -------------------------------------------------------------------------------------- : on construit la liste des fichiers à trier : -------------------------------------------------------------------------------------- cd /d "!dossierATrier!" || exit /b 1 cls & echo. & echo Analyse du dossier en cours, merci de bien vouloir patienter quelques minutes ... dir /b /s /a-d %filtre% >"%listeFichiers%" : -------------------------------------------------------------------------------------- : on copie les fichiers correspondants au dossier nominatif : -------------------------------------------------------------------------------------- cd /d "!dossierCible!" || exit /b 1 set compteur=0 for /f "delims=" %%A in ('2^>nul dir /b /ad') do ( echo. & echo ############### Dossier en cours de traitement : %%A for /f "delims=" %%B in ('2^>nul findstr /i "%%A" "%listeFichiers%"') do ( set /a compteur+=1 rem echo. xcopy "%%~B" "%%~dpnA\" /c /y >nul && echo "%%~B"?"%%~dpnA\" title Nombre de fichiers traités : !compteur! ) )>>"%log%" : -------------------------------------------------------------------------------------- : fin du script : -------------------------------------------------------------------------------------- set nbFichiersATraiter=0 for /f "delims=" %%A in ('type "%listeFichiers%"') do set /a nbFichiersATraiter+=1 cls & echo. & echo Résultat du tri : !compteur! fichiers effectivement traités echo. & echo Nombre de fichiers à trier (avant traitement) : %nbFichiersATraiter% fichiers echo. & echo. & pause explorer /select,"%log%" exit
-
-
Ca fonctionne nickel !
Bravo et merci beaucoup :D
-
Oui,pardon !
-
Bonjour Barnabe0057,
Le script a trop bien fonctionné et j'ai des fichiers copiés en double ou triple car la recherche de correspondance se fait aussi sur une partie de nom/prénom.
Par exemple je retrouve un fichier "CV Dupont Anna.doc" dans le dossier "Dupont Anna" mais aussi dans le dossier "Dupontelle Gérard" et "Martin Anna".
Est-il possible de modifier afin que la recherche soit plus stricte STP ?
Encore merci pour tout !
-
Désolée pour le délai de réponse...
Les noms des dossiers ont tous la même forme : Nom + Prénom
Par contre les fichiers ont soit le nom, soit le prénom, soit les 2 inclus dans leur nom.
Est-il possible que la recherche sur "Anna" par exemple ne recense pas les "Annabelle Annalise Marianna"... ?
Si ce n'est pas possible, je veux bien la modif savec la recherche nom+prénom exactement comme sur les dossiers destination ; tant pis pour les dossiers qui passerons à l'as.
Merci d'avance
-
Bonjour,
Est-il possible que la recherche sur "Anna" par exemple ne recense pas les "Annabelle Annalise Marianna"... ?
J'ai fait une correction, voici le nouveau code :
@echo off mode con cols=140 lines=35 setlocal enableextensions enabledelayedexpansion ver | find "10.0." >nul && chcp 65001 >nul || chcp 1252 >nul color 0F : -------------------------------------------------------------------------------------- : on définit les variables : -------------------------------------------------------------------------------------- set "filtre=*.*" set "listeFichiers=%TMP%\liste_des_fichiers.txt" for /f "tokens=1,2,3 delims=/ " %%a in ('date /t') do set "maDate=%%c%%b%%a" for /f "tokens=1,2 delims=:" %%a in ('time /t') do set "heure=%%a%%b%time:~6,2%" set "log=%TMP%\tri_%maDate%_%heure%.txt" : -------------------------------------------------------------------------------------- : on choisit le dossier contenant les fichiers à trier : -------------------------------------------------------------------------------------- cls & echo. & echo ^>^>^> Nom complet (chemin + nom) du dossier à trier : set /p dossierATrier=">>> " if not defined dossierATrier (exit /b 1) if not exist "%dossierATrier%" (exit /b 1) : -------------------------------------------------------------------------------------- : on choisit le dossier contenant les dossiers nominatifs : -------------------------------------------------------------------------------------- echo. & echo. & echo ^>^>^> Nom complet (chemin + nom) du dossier parent contenant les dossiers des personnes : set /p dossierCible=">>> " if not defined dossierCible (exit /b 1) if not exist "%dossierCible%" (exit /b 1) : -------------------------------------------------------------------------------------- : on construit la liste des fichiers à trier : -------------------------------------------------------------------------------------- cd /d "!dossierATrier!" || exit /b 1 cls & echo. & echo Analyse du dossier en cours, merci de bien vouloir patienter quelques minutes ... dir /b /s /a-d %filtre% >"%listeFichiers%" : -------------------------------------------------------------------------------------- : on copie les fichiers correspondants au dossier nominatif : -------------------------------------------------------------------------------------- cd /d "!dossierCible!" || exit /b 1 set compteur=0 for /f "tokens=1 delims= " %%A in ('2^>nul dir /b /ad') do ( echo. & echo ############### Dossier en cours de traitement : %%A for /f "delims=" %%B in ('2^>nul findstr /i /r "\<%%A\>" "%listeFichiers%"') do ( set /a compteur+=1 rem echo. xcopy "%%~B" "%%~dpnA\" /c /y >nul && echo "%%~B"?"%%~dpnA\" title Nombre de fichiers traités : !compteur! ) )>>"%log%" : -------------------------------------------------------------------------------------- : fin du script : -------------------------------------------------------------------------------------- set nbFichiersATraiter=0 for /f "delims=" %%A in ('type "%listeFichiers%"') do set /a nbFichiersATraiter+=1 cls & echo. & echo Résultat du tri : !compteur! fichiers effectivement traités echo. & echo Nombre de fichiers à trier (avant traitement) : %nbFichiersATraiter% fichiers echo. & echo. & pause explorer /select,"%log%" exit -
@barnabe0057
Dans cette version le script se base uniquement sur le nom de famille du dossier, le prénom n'étant pas fiable puisque plusieurs personnes peuvent avoir le même prénom.
-
La recherche est plus stricte également : si le nom à rechercher est anna elle ne prendra plus en compte les annabelle annalisa, ...
-
@barnabe0057
Génial Merci encore !
-
-
Encore une petite chose : les dernier script crée des dossiers au lieu de dispatcher dans les dossiers déjà existants ... est-il possible de rectifier ?
Merci et bon week-end si c'est le cas !
-
Je suis vraiment désolée de vous solliciter à nouveau ...
J'ai refait des tests et en fait le script crée des nouveaux dossiers quand les dossiers existants ne sont pas au nom strict de la recherche.
Par exemple :
Pour le dossier "Dupont Marie" , il va créer un dossier "Dupont" et y intégrer les docs incluant le nom "Dupont".
Du coup je me retrouve avec 2 dossiers : un "Dupont" avec documents, un "Dupont Marie" que j'avais déjà créé; vide.
J'ai fait un test avec un dossier "tata" et un fichier "tata", il a collé le fichier "tata" dans le dossier "tata" sans créer de nouveau dossier.
J'espère que ces informations pourront aider. merci encore !