[batch] deplacer fichier
PYJ_31 -
J'aimerai pouvoir créer un fichier .bat pour déplacer les fichiers dont leur date est inférieur a 2006.
j'utilise la commande 'move (chemin)(destination)'
mais je ne sais pas comment lui dire 'ou la date est inférieur a 2006'
Configuration: Windows XP Firefox 2.0.0.14
18 réponses
Un script .bat doit déplacer les fichiers datés avant 2006 sous Windows XP, afin d'automatiser le tri par date de modification et de restreindre l'opération à un répertoire donné. Plusieurs solutions évoquent l'utilisation de DIR pour lister, et d'options /O:D /T:W pour la date, FINDSTR et FOR /F avec redirection, avant d'employer MOVE avec des chemins complets. D'autres approches proposent des scripts VBScript pour une gestion plus robuste, tandis que certains expliquent comment passer des seuils via des paramètres (%1, %2) et traiter les dossiers. Pour éviter les erreurs, il est recommandé de tester dans un répertoire isolé, d'utiliser des chemins complets et des guillemets, et d'expliquer clairement les valeurs paramétrées.
-
Essaye ca :
@echo off
rem on liste les fichiers du répertoire en cour en triant par date de modification et on écrit la liste dan le fichier tmp
dir /O:D /T:W > tmp
rem On ne garde que les fichier et on ne garde que ceux de 2006
findstr /V /C:"<REP>" "tmp"|findstr /C:"/2006" > tmp2
rem On efface le fichier tmp
del tmp
rem pour chaque entrée, on efface le fichier, ici simulé par un echo (del /F /Q)
for /F "tokens=4" %%I IN (tmp2) DO @echo %%I
rem On efface le fichier tmp2
del tmp2 -
Pardon, ça prouve que je suis pas un bon développeur ;p
DIR /O:D /T:W > tmp
Je fait un dir pour lister les fichiers du répertoire. L'option O:D permet de trier les entrées par date, l'option T:W défini le champ date comme étant la date de dernière modification. le > tmp permet de rediriger la sorti vers un fichier tmp (j'aurai pu l'apeler toto.txt si tu préfère...), ce qui fait qu'il n'y aura pas d'affichage du dir mais que tout sera dans un fichier tmp (si tu execute la commande dans une fenêtre cmd (Démarrer > Executer > cmd ), tu ne vera rien s'afficher, mais si tu ouvre tmp avec notepad, tu verra l'affichage du dir!
FINDSTR /V /C:"<REP>" "tmp" | FINDSTR /C:"/2006" > tmp2
La j'ai été cruel avec toi! j'utilisae findstr pour chercher les lignes dans le fichier tmp NE CONTENANT PAS (option /V) la chaine de charactère (le /C:) <REP> pour ne garder que les fichiers. le | est ce que l'on appel un "pipe", il permet de rediriger (comme le > ci-dessus!) la sorti de la commande vers une autre commande, qui est en l'occurence un autre findstr qui va chercher les lignes CONTENANT la chaine de charactère /2006 dans le résultat (et donc uniquement la liste de fichier, sans les répertoire) de la précedente commande.
FOR /F "tokens=4" %%I IN (tmp2) DO @ECHO %%I
En gros, ca dit "Pour chaques 4em champqui vont être égal a I dans le fichier tmp2, execute la commande @ECHO (le @ permet de ne pas afficher la ligne c:\echo ...) avec le contenu de I. Les champs sont les entrées séparré par des espaces ou des tabulations (regarde l'affichage du dir, et tu verra que le nom de fichier est dans le quatrième champ).
Les deux % c'est pour le script, dans une fenêtre de commande, un seul suffit (voir cmd /?)
Pour toi, tu remplacera le echo par un DEL /F /Q
Je t'invite a taper chaque commande avec /? en paramètre pour afficher l'aide, tu auras plus de détails.
En fait si tu regarde bien, j'aurai pu écrire :
DIR /T:W | FINDSTR /V /C:"<REP>" | FINDSTR /C:"/2006" > tmp
FOR /F "tokens=4" %%I IN (tmp) DO @ECHO %%I
Mais j'ai préféré décomposer un peut -
Ha, temps que j'y suis, quelques améliorations possibles :
Remplacer /2006 par une variable que tu peut définir en paramètre de ton script (claques paramètre correspondant a %1, %2....%0 étant le nom du script)
Rajouter une variable après les option du dir contenant le chemin d'accès aux fichiers que tu veut traiter
...
Je te conseil de taper HELP dans une interface de commande, tu verra les commande de base du shell windows et NET HELP pour voir ce que l'on appel les commandes NT4 -
Heu, effectivement, en VBS c'est mieux...Désolé, je trouvai ça fun de le faire en batch!
Mais floriaan60, je te conseil de te mettre au VBS pour l'administration Windows, bien que personnellement je n'aime pas du tout (je trouve pas ce langage logique, je préfère le C/C++ ou les langages shell d'unix (BASH, KSH...) qui sont plus simples a mon gout) -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
-
-
xcopy c:\Temp*.?????? c:\2006 /s /e
Kesako que le ".?????" ?
Cmd = xcopy [source] [Dest] [Option]
La tu as 3 paramètres..le 2nd est étrange -
d'accor.
Mais au final, il est ou mon dossier avec tous les fichier non modifié depuis 2006 ? lol -
au final j'ai ce code:
@echo off
rem on liste les fichiers du répertoire en cour en triant par date de modification et on écrit la liste dan le fichier tmp
dir /O:D /T:W > tmp
rem On ne garde que les fichier et on ne garde que ceux de 2006
findstr /V /C:"<REP>" "tmp"|findstr /C:"/2006" > tmp2
rem On efface le fichier tmp
del tmp
rem pour chaque entrée, on efface le fichier, ici simulé par un echo (del /F /Q)
for /F "tokens=4" %I IN (tmp2) DO move %%i C:\2006
rem On efface le fichier tmp2
del tmp2
J'ai tmp2 qui se créer sur mon bureau mais c'est tous ce que je vois lol-
Dans l'état le batch doit être situé dans le même répertoire où sont les données à bouger. Si tu veux pouvoir le lancer depuis n'importe quel emplacement, il faut que tu rajoutes au début du batch la commande
DIR C:\TonRepertoireSource /O:D /T:W > tmp (mets des guillements si le nom du répertoire source contient des espaces. "C:\Documents dnd Settings\User\Mes documents" par exemple)
Il y a quelque chose dans C:\2006 ?
Ouvre ton fichier tmp2 avec le bloc notes, y'a quoi dedans ?
-
-
J'ai enlevé le contenu de 2006
J'ai mis le .bat dans le dossier de ce que je veux copier.
2006 est vide
tmp2 est vide
mais es-ce qu'il copie les dossier ? -
Heu essaye plutot :
dir "c:\ton repertoire" /O:D /T:W
N'oublie pas les deux point sinon, ca ne marche pas.
Désolé, j'avais oublié que tu voulais déplacer...
T'as pas un fichier 2006 sur ton c:\ des fois? dans le doute, rajoute les guillement autour de c:\2006 et met un \ a la fin. Rajoute aussi le chemin complet de ton fichier source.
for /F "tokens=4" %I IN (tmp2) DO move "c:\ton repertoire\"%%i "C:\2006\"
Pour pas t'embéter, aprés le @echo off, rajoute la ligne SET MONREP="c:\monrepertoire\" et remplace "c:\monrepertoire\" par %%MONREP -
j'ai cette ligne
for /F "tokens=4" %I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\"%%i "C:\2006\"-
code du batch:
@echo off
rem on liste les fichiers du répertoire en cour en triant par date de modification et on écrit la liste dan le fichier tmp
dir /O:D /T:W > tmp
rem On ne garde que les fichier et on ne garde que ceux de 2006
findstr /V /C:"<REP>" "tmp"|findstr /C:"/2008" > tmp2
rem On efface le fichier tmp
del tmp
rem pour chaque entrée, on efface le fichier, ici simulé par un echo (del /F /Q)
for /F "tokens=4" %I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\"%%i "C:\2006\"
rem On efface le fichier tmp2
del tmp2
-
-
J'ai Windows XP SP2 et ca ca marche chez moi (en gras ce que j'ai modifié
@echo off
SET MONREP=c:\
echo %MONREP%
rem on liste les fichiers du répertoire en cour en triant par date de modification et on écrit la liste dan le fichier tmp
dir %MONREP% /O:D /T:W > tmp
rem On ne garde que les fichier et on ne garde que ceux de 2006
findstr /V /C:"<REP>" "tmp"|findstr /C:"/2006" > tmp2
rem On efface le fichier tmp
del tmp
rem pour chaque entrée, on efface le fichier, ici simulé par un echo (del /F /Q)
for /F "tokens=4" %%I IN (tmp2) DO copy "%MONREP%%%I" C:\2006
rem On efface le fichier tmp2
del tmp2 -
Et pour info, ni
for /F "tokens=4" %I IN (tmp2) DO move %%i C:\2006
ni
for /F "tokens=4" %%I IN (tmp2) DO move %%i C:\2006
ne marcheront parceque c'est
for /F "tokens=4" %I IN (tmp2) DO move %%I C:\2006 -
Tu peut retirer le echo %MONREP%, c'est juste pour le debuging et remplace copy par move.
Je pense que si l'un marche, l'autre marchera aussi. -
-
déplacement ok aussi.
et vous n'aurez pas une astuce pour copier aussi les dossiers qui contiennent des fichiers de 2006 avec l'arborescence ?-
- Quelque chose comme ca :
Sub DeplaceFichiers(LaSource, LaDestination) ' Crée le répertoire cible If Not Fso.FolderExists(LaDestination) Then fso.CreateFolder LaDestination End If Set Dossier = fso.GetFolder(LaSource) Set Fichiers = Dossier.Files ' Déplace les fichiers For Each fichier in fichiers If year(fichier.DateLastModified) ="2006" Then fso.MoveFile fichier.path, LaDestination End If Next ' Sous-dossiers Set Dossiers = fso.GetFolder(LaSource).SubFolders For Each dossier in Dossiers ' Récursivité DeplaceFichiers dossier.path, LaDestination & dossier.name & "\" Next End Sub Set fso = CreateObject("Scripting.FileSystemObject") Source = "H:\DISQUE_F_A_TRIER" Dest = "H:\VieuxFichiers\" DeplaceFichiers Source, Dest
Surement perfectible : suppression des dossiers vides par exemple
-
-
Hum, t'es pas compliqué toi comme gars ;p
Moi je ferai un fichier rep.txt dans le même dossier que mon batch, contenant la liste de tout les chemins concernés (ATTENTION NE PAS FAIRE CA DANS C:\WINNT\SYSTEM32)
Je créerai ensuite un batch contenant un truc du style(je te laisse perfectionner...) :
FOR %%J IN (rep.txt) DO CALL batch1.bat %%J
et dans batch1.bat, je remplacerai SET MONREP=c:\ par SET MONREP=%1%
Mais il doit y avoir d'autres moyen.
Le poste 29, je l'ai pas trouvé, c'est normal?