Rechercher : dans
Par :

[batch] deplacer fichier

Dernière réponse le 5 jun 2008 à 16:40:13 floriaan60, le 5 jun 2008 à 09:48:45 
 Signaler ce message aux modérateurs

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'

Configuration: Windows XP
Firefox 2.0.0.14

Meilleures réponses pour « [batch] deplacer fichier » dans :
Renommer plusieurs fichiers en batch VoirLe fait de renommer un grand nombre de fichiers peut très vite devenir fastidieux. Heureusement, il existe des outils permettant d'automatiser cette tâche dans un grand nombre de cas : Fonctionnalités natives Utilisation d'un programme...
[MS-Dos] Ecrire dans un fichier texte en batch VoirPour écrire dans un fichier texte, il suffit d'utiliser une redirection ">" : echo texte_à_ecrire > fichier_de_sortie.txt Pour écrire à la fin d'un texte existant (concaténation) : echo "écriture a la fin du fichier ">>...
Fichier utilisé - Le fichier est ouvert dans un autre programme VoirLorsque vous souhaitez supprimer ou déplacer un fichier, Windows se plaint avec le message suivant : Fichier utilisé Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme Fermez l'application concernée Avant...

1

yoogui, le 5 jun 2008 à 09:50:43

Xcopy avec option /D ?

Répondre à yoogui

2

floriaan60, le 5 jun 2008 à 09:52:10

Bah j'aimerai utiliser move ...
ou alors copier puis suprimmer

Répondre à floriaan60

3

floriaan60, le 5 jun 2008 à 09:56:57

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.

Répondre à floriaan60

4

floriaan60, le 5 jun 2008 à 10:11:47

Xcopy c:\Temp*.?????? c:\2006 /s /e
'Impossible de réaliser une copie cyclique'

Pourquoi?

Répondre à floriaan60

5

yoogui, le 5 jun 2008 à 10:18:06

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

Répondre à yoogui

6

floriaan60, le 5 jun 2008 à 10:39:06

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

Répondre à floriaan60

7

PYJ_31, le 5 jun 2008 à 11:29:44

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

Répondre à PYJ_31

8

floriaan60, le 5 jun 2008 à 13:40:37

Ouais... Euh tu peux m'expliquer un petit peu plus en detail ? Parce que je comprend pas tous le code lol

Répondre à floriaan60

9

PYJ_31, le 5 jun 2008 à 14:42:59

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

Répondre à PYJ_31

10

PYJ_31, le 5 jun 2008 à 14:48:35

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

Répondre à PYJ_31

11

floriaan60, le 5 jun 2008 à 15:03:43

D'accor.
Mais au final, il est ou mon dossier avec tous les fichier non modifié depuis 2006 ? lol

Répondre à floriaan60

12

onesdf, le 5 jun 2008 à 15:08:35

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

Répondre à onesdf

13

floriaan60, le 5 jun 2008 à 15:13:05

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

Répondre à floriaan60

14

onesdf, le 5 jun 2008 à 15:19:40

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 ?

Répondre à onesdf

15

floriaan60, le 5 jun 2008 à 15:24:50

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 ?

Répondre à floriaan60

16

onesdf, le 5 jun 2008 à 15:32:33

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 ?

Répondre à onesdf

18

floriaan60, le 5 jun 2008 à 15:49:43

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

Répondre à floriaan60

19

onesdf, le 5 jun 2008 à 15:52:35

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 ?

Répondre à onesdf

17

PYJ_31, le 5 jun 2008 à 15:48:39

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

Répondre à PYJ_31

20

floriaan60, le 5 jun 2008 à 15:55:47

J'ai cette ligne
for /F "tokens=4" %I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\"%%i "C:\2006\"

Répondre à floriaan60

21

floriaan60, le 5 jun 2008 à 15:56:22

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

Répondre à floriaan60

22

onesdf, le 5 jun 2008 à 16:03:59

For /F "tokens=4" %%I IN (tmp2) DO move "C:\Documents and Settings\fdefrocourt\"%%i "C:\2006\"

Répondre à onesdf

23

onesdf, le 5 jun 2008 à 16:04:56

Au fait POURQUOI UN BATCH (mais tu vas répondre à la fin ?)

Répondre à onesdf

24

floriaan60, le 5 jun 2008 à 16:07:59

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

Répondre à floriaan60

29

onesdf, le 5 jun 2008 à 16:14:07

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

Répondre à onesdf

25

PYJ_31, le 5 jun 2008 à 16:09:18

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

Répondre à PYJ_31

26

PYJ_31, le 5 jun 2008 à 16:11:12

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

Répondre à PYJ_31

27

PYJ_31, le 5 jun 2008 à 16:13:06

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.

Répondre à PYJ_31

28

floriaan60, le 5 jun 2008 à 16:13:34

Ca marche. Le .bat placé sur le bureau a copié les fichiers contenu a la racine de C:

Répondre à floriaan60

30

floriaan60, le 5 jun 2008 à 16:16:30

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 ?

Répondre à floriaan60

31

onesdf, le 5 jun 2008 à 16:21:07

Voir Commentaire 29

Répondre à onesdf

32

floriaan60, le 5 jun 2008 à 16:25:54

Ah désolé il été caché.
Et en vbs ca donnerai quoi ?

Répondre à floriaan60

33

floriaan60, le 5 jun 2008 à 16:27:24

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 ...

Répondre à floriaan60

34

onesdf, le 5 jun 2008 à 16:32:13

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

Répondre à onesdf

35

PYJ_31, le 5 jun 2008 à 16:33:42

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?

Répondre à PYJ_31

36

onesdf, le 5 jun 2008 à 16:35:11

Parce que t'as mal cherché, il est au dessus du 25 :)

Répondre à onesdf

37

 PYJ_31, le 5 jun 2008 à 16:40:13

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)

Répondre à PYJ_31
Collection CommentÇaMarche.net