0

ディレクトリ内の更新をチェックし、新しいファイルまたは最近変更されたファイルを他の選択したディレクトリにコピーするバッチファイルがありますが、ソースディレクトリでリビジョン番号だけの2つのファイルをチェックする方法がわかりません。文字の違い:example.pdfとexampleA.pdf。文字列と変更日でファイルを比較する必要があります。したがって、ソースディレクトリにexampleB.pdfとして保存された新しいファイルがある場合、そのファイルを新しいファイル名ではなくexample.pdfとして宛先ディレクトリにコピーするバッチが必要です。必要に応じて、コピーしたファイルにコアファイル名を付けてください。example.pdfだけです。

どんな助けでも大歓迎です。

ありがとう

    @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
4

1 に答える 1

2

以下のバッチプログラムは、新しいファイルのリビジョン番号または文字がアルファベットの昇順であると想定しているため、最後にリストされたファイルが最新のファイルです。このようにして、プログラムは同じ名前で始まるファイルのセットを識別し、セットの最後のファイルをセットの最初のファイルの名前でコピーします。

@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!"

プログラムをテストし、必要に応じてECHOコマンドを削除します。

于 2012-11-06T20:51:04.977 に答える