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
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
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
"Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter"
Pas d'aide concernant le code par MP, le forum est là pour ça :)