Partage
  • Partager sur Facebook
  • Partager sur Twitter

Script Batch renommage de masse fichiers

Sujet résolu
13 décembre 2016 à 16:10:30

Bonjour,

J'essaie de créer un script pour renommer des fichiers selon certaines règles. Pour info voici ce que j'aimerais faire :

Pour chaque sous répertoire d'un répertoire donné faire

     Initialisation compteur

     Initialisation nom sous répertoire

     Pour chaque fichier du sous répertoire faire

          Initialisation date de création du fichier

          Initialisation date de modification du fichier

          Si date de création inférieure à date de modification alors

               date égale date création

          Sinon

               date égale date de modification

          Fin si

          Compteur++

          Renommer fichier %date%_%compteur%.txt avec le format "[AAAA-MM-JJ] Nom répertoire courant (N°).txt"

     Fin pour

Fin pour

J'ai déjà établi ce script :

for /r "C:\Users\Smallbeetle\Desktop\Repertoire test\DOSSIER2\" %%f in (*.txt) do (
	@echo off
	set fichier=%%f& set /a Compt+=1
	
	for /f %%c in (dir /TC "%fichier%") do set creation=%%c
	for /f %%m in (dir /TW "%fichier%") do set modification=%%m
	
	if %creation% LSS %modification%
		(%creation% > tmp.txt)
	else
		(%modification% > tmp.txt)
	call :PROCESS
	echo date est %datetmp%

	call :RENFILE

	del tmp.txt
	goto EXIT
	:PROCESS
	FOR /F "tokens=1-4 delims=/ " %%i in (tmp.txt) do set datetmp=[%%k-%%j-%%i]
	:RENFILE
	ren "%fichier%" "%datetmp%_%Compt%.txt"
)
:EXIT


Problème : je n'arrive pas à trouver comment faire pour comparer les dates. Idem pour mon compteur qui incrémente à chaque fois que j'appelle le script (le fichier test (1).txt devient test (2).txt). J'ai voulu l'initialiser à 0 avant la boucle mais du coup quand j'appelle mon script, il ne fonctionne que pour le premier fichier et je ne sais pas pourquoi.

Mon répertoire test contient une liste de fichier .txt. Pour l'instant j'essaie de faire la partie du script pour un seul répertoire sans sous répertoire. J'essaie d'abord de faire fonctionner ça. Si j'enlève ma comparaison des dates, j'ai bien par exemple [2016-12-13]_1.txt, [2016-12-13]_2.txt, etc.

Merci pour votre aide. C'est la première fois que je tente ça, j'essaie de comprendre.

-
Edité par Smallbeetle 14 décembre 2016 à 14:06:39

  • Partager sur Facebook
  • Partager sur Twitter
16 décembre 2016 à 17:33:50

Pour ceux que ça intéresse après moultes recherches et tests, j'ai enfin trouvé une solution. Pour l'instant elle ne fonctionne que pour un répertoire donné écrit en dur dans le code. Il y a moyen de mettre ce répertoire en paramètre lors de l'appel au script. J'en donnerai la solution lorsque j'aurai du temps. Ce code n'est peut-être pas optimum mais au moins il fonctionne. Il restera également aussi à ajouter une boucle pour pouvoir jouer le script pour des sous dossiers). Les "!" sont importants, c'est ce qui m'a permis de comprendre un peu plus comment faire fonctionner mon script. J'ai mis des commentaires pour aider à comprendre ("REM"). Idem j'ai gardé les "echo" et les "set variable" pour pouvoir avoir une trace en console au cas où vous auriez des erreurs, que vous puissiez voir d'où ça peut venir. ATTENTION : faire les tests sur des fichiers .txt. Sinon changer le script en conséquence. Vous pouvez par exemple faire un in (*.jpeg *.jpg *.gif *.png) et renommer tous les fichiers qui possèdent cette extension en .jpg par exemple (attention au rename du coup). Et évitez de faire un in (*.*) sinon vous risquez de modifier aussi votre .bat qui doit se trouver à la racine (avec cette solution) du dossier que vous voulez renommer.

REM boucle qui permet de jouer 2 fois le code pour etre sur de l'initialisation du compteur
for %%i in (1,1,2) do (
	REM desactive affichage des cmd
	echo off
	REM remet a blanc la console
	cls
	REM pour régler les problèmes d'expansion
	setlocal enabledelayedexpansion
	set cpt=0
	REM pour chaque fichier du répertoire donné
	for /r "C:\Users\Smallbeetle\Desktop\Repertoire test\DOSSIER2\" %%f in (*.txt) do (
		set /a cpt+=1
		
		echo fichier est %%f
		
		REM ecriture de la dernière date de modification dans un fichier temporaire
		dir /TW "%%f" | find "/" > tmp1.txt
		FOR /F "tokens=1-4 delims=/ " %%i in (tmp1.txt) do set datemod=[%%k-%%j-%%i]
		
		echo date modif est !datemod!
		
		del tmp1.txt
		
		REM ecriture de la date de creation dans un fichier temporaire
		dir /TC "%%f" | find "/" > tmp2.txt
		FOR /F "tokens=1-4 delims=/ " %%l in (tmp2.txt) do set datecrea=[%%n-%%m-%%l]
		
		echo date creat est !datecrea!
		
		del tmp2.txt
		
		REM parfois la date de derniere modification est anterieure a celle de la date de creation quand on déplace un fichier par exemple
		if /i "%datecrea%" LSS "%datemod%" (set datef=!datecrea!) else (set datef=!datemod!)
		
		echo date finale est !datef!
		
		REM recuperation du nom du repertoire courant sans le chemin complet
		for %%o in ("%cd%") do set "rep=%%~nxo"
		
		echo repertoire courant est !rep!
		
		REM renommage du fichier au format [AAAA-MM-JJ] Repertoire (N°)
		ren "%%f" !datef!" "!rep!" ("!cpt!")".txt
	)
	endlocal
)



-
Edité par Smallbeetle 16 décembre 2016 à 19:33:49

  • Partager sur Facebook
  • Partager sur Twitter
7 décembre 2020 à 9:59:29

a
  • Partager sur Facebook
  • Partager sur Twitter

"Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter"

7 décembre 2020 à 15:04:36

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)