2010-08-24 14 views
1

Je voudrais écrire un fichier batch contenant des commandes DOS (malheureusement perl ou une autre langue n'est pas une option) pour faire la tâche suivante.
Dans un répertoire (c: \ MyData \ Répertoire1) il y a les fichiers suivants:
FILE2.TXT
File2.dat
FileA.bin
FileQ.bin
FileC.bin
File8.bin
File2.bin
Ces fichiers ont tous des dates de création différentes. Le fichier * .bin créé le plus récemment est File2.bin dans cet exemple, mais il peut s'agir de n'importe quel fichier * .bin nommé de manière aléatoire.Fichier batch pour copier tous les nouveaux fichiers sauf le plus récent

Dans un autre répertoire (c: \ MyData \ Directory2) il y a les fichiers suivants:
FILE2.TXT
File2.dat
FileA.bin
FileQ.bin

Voici ce que je veux faire:
Copiez tous les fichiers portant l'extension * .bin dans Directory1 qui n'existent pas déjà dans Directory2 à l'exception de pour le dernier fichier * .bin créé dans Directory1. Ainsi, les seuls fichiers qui doivent être copiés dans Directory2 sont:
FileC.bin - Copier parce qu'il est un fichier bin qui est pas encore Directory2
File8.bin - Copier parce qu'il est un fichier bin qui est pas encore Directory2

les fichiers suivants doivent pas être copiés dans Directory2:
fILE2.TXT - l'extension incorrect alors ne copiez pas
File2.dat - l'extension incorrect alors ne copiez pas
FileA.bin - existe déjà dans Directory2 donc ne le copiez pas
FileQ.bin - existe déjà dans Directory2 donc d on't le copier
File2.bin - le plus récent fichier * .bin donc ne le copiez pas

Merci pour toute aide!

+0

VBScript ou PowerShell sont également disponibles? – Fionnuala

+0

Je ne suis pas sûr ... La tâche doit s'exécuter à partir de Windows Scheduler sur la machine d'une autre personne qui est un programmeur débutant mais familier avec les fichiers batch.Une fois que je lui ai donné ce fichier batch, il doit pouvoir le modifier si la tâche change (par exemple, s'il a changé les noms de Directory1 et Directory2). – KAE

Répondre

0

Vous pouvez utiliser DIR *.bin /o-d /b > Files.txt pour obtenir la liste des fichiers bin classés les plus récents pour durer. Faites cela sur les deux dossiers (pour séparer les fichiers de sortie), puis configurez une boucle FOR, peut-être deux boucles FOR imbriquées, pour parcourir les deux fichiers, sélectionnez ceux à copier (avec une manipulation spéciale pour le premier dans la date -ordered list) et les copier depuis la boucle. Des astuces stupides seraient faites avec le réglage de l'attribut, puis en utilisant XCOPY /M pour les copier tous en même temps, mais cela semble trop difficile. J'ai toujours trouvé que les boucles FOR étaient des bêtes féroces, et si vous pouviez trouver un moyen non-batch-file, ou une forme de plug-in tiers pour vous aider, vous seriez en avance sur le jeu.

+0

Très utile, merci. Si je le fais fonctionner, je posterai le code. – KAE

3
@echo off 
@rem  Sorry for excessive commenting - I am a batch file newbie 
@rem  Batch file will not work if there are spaces in names of directory or copied files 
@rem  Next line allows for/do loop to work correctly 
setlocal enabledelayedexpansion 

@rem  Make temporary file that lists files from newest to oldest 
DIR /o-d /b c:\temp\Directory1\*.bin > FileList.txt 

@rem  Counter will be used to avoid copying newest file which is listed first 
set /A Counter=1 

@rem  Read in names of all files with chosen extension in the first directory 
@rem  Names will be stored in the variable %%a 
for /F "delims=" %%a in (C:\temp\FileList.txt) do (

@rem  Increment the counter 
    set /A Counter+=1 
@rem  Only copy files that are not the most recent one, so Counter>1 
@rem  Requires the exclamation points because this is a string not number comparison 
    if !Counter! gtr 1 (
@rem  If the file does not already exist in Directory2, copy it 
      if not exist C:\temp\Directory2\%%a (
        echo Copying C:\temp\Directory1\%%a to C:\temp\Directory2\%%a 
        copy C:\temp\Directory1\%%a C:\temp\Directory2\%%a 
      ) 
    ) 
) 
@rem  Remove the temporary file 
del FileList.txt 
+0

Il est possible d'avoir trop de commentaires; ici, vous n'avez pas trop de commentaires. Intégrez des objets DOS (dossiers, fichiers) dans des guillemets pour gérer les espaces, mais vérifiez-les pour vérifier que vous avez bien compris. Sinon, ça me va bien! –

0

Je n'ai pas Robocopy sur ma machine, sinon je ferais un /? et vous dire. Mais si je me souviens, il a beaucoup plus de capacités (en particulier pour les timestamps). C'est un outil Windows. http://en.wikipedia.org/wiki/Robocopy

Questions connexes