[batch] deplacer fichier

Fermé
floriaan60 - 5 juin 2008 à 09:48
 PYJ_31 - 5 juin 2008 à 16:40
Bonjour,

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'
A voir également:

18 réponses

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
1
Ouais... Euh tu peux m'expliquer un petit peu plus en detail ? Parce que je comprend pas tous le code lol
0
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
1
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
1
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)
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yoogui Messages postés 2021 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 13 avril 2011 316
5 juin 2008 à 09:50
xcopy avec option /D ?
0
bah j'aimerai utiliser move ...
ou alors copier puis suprimmer
0
oui mais D/ va ma copié les fichiers modifié depuis 2006 mais je veux l'inverse. c'est a dire les fichiers non modifiés depuis 2006.
0
floriaan60 > floriaan60
5 juin 2008 à 10:11
xcopy c:\Temp*.?????? c:\2006 /s /e
'Impossible de réaliser une copie cyclique'

Pourquoi?
0
yoogui Messages postés 2021 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 13 avril 2011 316
5 juin 2008 à 10:18
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
0
enfaite j'essai de copié les fichiers non modifiés depuis une date, or, D/ copie les fichiers qui ont été modifiés depuis une date
0
d'accor.
Mais au final, il est ou mon dossier avec tous les fichier non modifié depuis 2006 ? lol
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120
5 juin 2008 à 15:08
Je crois qu'il est nul part pour l'instant, il ne fait que les afficher ( echo %%i ).

Si tu veux les déplacer, remplaces echo %%i par move %%i D:\TonDossier
0
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
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120
5 juin 2008 à 15:19
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 ?
0
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 ?
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120
5 juin 2008 à 15:32
Ca donne quoi un DIR /OD /TW à la main sous DOS ? Y'a bien des fichiers 2006 en premier ?

Pour les sous-dossiers, il ne les parcoure pas, et c'est au dessus de mes compétences.

Au fait, pourquoi à tout prix un batch ?
0
floriaan60 > onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008
5 juin 2008 à 15:49
je viens de remarquer que je n'avais pas de fichier 2006 lol
j'ai donc changé et mis 2008
maintenant dans tmp2 il y a 3 fichiers mais rien dans 2006
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120 > floriaan60
5 juin 2008 à 15:52
Tu as cette ligne là :

for /F "tokens=4" %I IN (tmp2) DO move %%i C:\2006

ou celle là

for /F "tokens=4" %%I IN (tmp2) DO move %%i C:\2006 ?

Seule la seconde est bonne.

Et pourquoi un batch ?
0
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
0
j'ai cette ligne
for /F "tokens=4" %I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\"%%i "C:\2006\"
0
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
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120 > floriaan60
5 juin 2008 à 16:03
for /F "tokens=4" %%I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\"%%i "C:\2006\"
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120 > onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008
5 juin 2008 à 16:04
Au fait POURQUOI UN BATCH (mais tu vas répondre à la fin ?)
0
floriaan60 > onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008
5 juin 2008 à 16:07
Alors la je n'ai plus de tmp2 et le dossier 2006 est vide lol
un batch pour automatiser le travail des déplacements :d
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120 > floriaan60
5 juin 2008 à 16:14
Je me doute que c'est pour automatiser les déplacements, mais un script vbs serait beaucoup plus simple à faire qu'un fichier bat où il faut souvent alambiquer autour des commandes DOS.

De plus un script VBS permettrait de gérer les sous-dossiers, ce qui me semble mission impossible en bat
0
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
0
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
0
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.
0
Ca marche. Le .bat placé sur le bureau a copié les fichiers contenu a la racine de C:
0
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 ?
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120
5 juin 2008 à 16:21
Voir Commentaire 29
0
floriaan60 > onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008
5 juin 2008 à 16:25
ah désolé il été caché.
Et en vbs ca donnerai quoi ?
0
floriaan60 > floriaan60
5 juin 2008 à 16:27
je connais légèrement les commande DOS donc je me suis dis on va faire un .bat
mais le vbs je connais absolument pas ...
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120 > floriaan60
5 juin 2008 à 16:32
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
0
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?
0
onesdf Messages postés 375 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 17 octobre 2008 120
5 juin 2008 à 16:35
Parce que t'as mal cherché, il est au dessus du 25 :)
0