2012-11-06 1 views
0

J'ai un fichier batch qui va vérifier les mises à jour dans un répertoire puis copier les nouveaux fichiers ou les fichiers modifiés récemment dans l'autre répertoire, cependant je ne sais pas comment vérifier le répertoire source pour dire deux fichiers qui ont juste un numéro de révision ou une différence de lettre: example.pdf et exampleA.pdf. J'ai besoin de comparer les fichiers en quelque sorte par la chaîne et la date de modification. Donc, si le répertoire source a un nouveau fichier qui a été sauvegardé comme exampleB.pdf, j'ai besoin du batch pour copier ce fichier dans le répertoire de destination comme example.pdf au lieu du nouveau nom de fichier. Je veux que le fichier copié ait le nom de fichier de base si vous voulez, étant juste example.pdflot-fichier comparer les noms de fichiers similaires dans un répertoire puis copier le dernier fichier modifié et enregistrer dans un autre répertoire

Toute aide serait grandement appréciée.

Merci

@Echo Off 
:: variables 
set drive=G:\Backup 
set backupcmd=xcopy /s /c /d /e /h /i /r /y 

set revchk=if 

Set _Delay=10 
Set _Monitor=C:\Users\me\Desktop\Test Source Folder 
Set _Base=%temp%\BaselineState.dir 
Set _Chck=%temp%\ChkState.dir 
Set _OS=6 
Ver|Findstr /I /C:"Version 5">Nul 
If %Errorlevel%==0 Set _OS=5 & Set /A _Delay=_Delay*1000 
:_StartMon 
Call :_SetBaseline "%_Base%" "%_Monitor%" 
:_MonLoop 
If %_OS%==5 (Ping 1.0.0.0 -n 1 -w %_Delay%>Nul) Else Timeout %_Delay%>Nul 
Call :_SetBaseline "%_Chck%" "%_Monitor%" 
FC /A /L "%_Base%" "%_Chck%">Nul 
If %ErrorLevel%==0 Goto _MonLoop 

echo ### Backing up... 
%backupcmd% "C:\Users\me\Desktop\Test Source Folder" "C:\Users\me\Desktop\Test Destination Folder" 


echo ### Checking for new file revisions... 



Echo.Backup Complete! 
Goto :_StartMon 
::::::::::::::::::::::::::::::::::::::::::::::::::: 
:: Subroutine 
::::::::::::::::::::::::::::::::::::::::::::::::::: 
:_SetBaseline 
If Exist "%temp%\tempfmstate.dir" Del "%temp%\tempfmstate.dir" 
For /F "Tokens=* Delims=" %%I In ('Dir /S "%~2"') Do (
Set _Last=%%I 
>>"%temp%\tempfmstate.dir" Echo.%%I 
) 
>"%~1" Findstr /V /C:"%_Last%" "%temp%\tempfmstate.dir" 
Goto :EOF 

Répondre

2

Le programme batch ci-dessous supposent que les fichiers les plus récents ont des numéros de révision ou de lettres dans l'ordre croissant Alphabetical ordre, de sorte que le dernier fichier est répertorié le plus récent. De cette façon, le programme identifie un ensemble de fichiers commençant par le même nom et copie le dernier de l'ensemble avec le nom du premier dans l'ensemble.

@echo off 
setlocal EnableDelayedExpansion 
set baseName= 
for %%a in (*.*) do (
    if not defined baseName (
     rem Is first name of first set 
     set baseName=%%~Na 
     set baseExt=%%~Xa 
     set lastName=%%~Na 
    ) else (
     rem Check if this name begin with same baseName 
     set name=%%~Na 
     for %%b in (!baseName!) do set name=!name:*%%b=! 
     if "!name!" neq "%%~Na" (
     rem Yes: Is next name of same set 
     set lastName=%%~Na 
    ) else (
     rem No: Is first name of next set: copy previous set and pass to next one 
     ECHO copy "!lastName!!baseExt!" "C:\dest\dir\!baseName!!baseExt!" 
     set baseName=%%~Na 
     set baseExt=%%~Xa 
     set lastName=%%~Na 
    ) 
    )  
) 
rem Copy last set 
ECHO copy "!lastName!!baseExt!" "C:\dest\dir\!baseName!!baseExt!" 

Testez le programme et supprimez les commandes ECHO si cela fonctionne comme vous le souhaitez.

+0

Merci, je vais le tester et vous le faire savoir. J'apprécie votre réponse. – cheapkid1

+0

N'ai-je pas besoin d'un répertoire source ici aussi, je vois seulement un répertoire dest? – cheapkid1

+0

Je ne peux pas le faire fonctionner, il s'exécute, mais ne copie pas le dernier fichier rev du dossier source vers le dossier de destination, ou même le fichier d'origine. Aucune suggestion? – cheapkid1

Questions connexes