批处理文件比较目录中相似的文件名,然后复制最后修改的文件并保存到其他目录

Posted

技术标签:

【中文标题】批处理文件比较目录中相似的文件名,然后复制最后修改的文件并保存到其他目录【英文标题】:batch-file compare similar filenames in a directory then copy the last modified file and save as to other directory 【发布时间】:2012-11-06 16:09:26 【问题描述】:

我有一个批处理文件,它将检查目录中的更新,然后将任何新文件或最近修改的文件复制到另一个选定的目录,但是我不确定如何检查源目录中的两个文件修订号或字母差异: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

【问题讨论】:

【参考方案1】:

下面的批处理程序假定较新的文件具有按字母升序排列的修订号或字母,因此最后列出的文件是最新的。这样,程序会识别一组以相同名称开头的文件,并使用该组中第一个文件的名称复制该组中的最后一个文件。

@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 命令,如果它可以正常工作。

【讨论】:

谢谢,我会测试它并告诉你。感谢您的回复。 这里不需要源目录吗,我只看到一个dest目录? 我无法让它工作,它运行,但不会将最新文件 rev 从源文件夹复制到目标文件夹,甚至原始文件。有什么建议吗? @cheapkid1:请注意,程序只是显示执行的命令。正如我之前所说,您必须在包含文件的目录中测试(执行)程序并检查 copy 命令 SHOWN 是否符合您的要求。如果是这样,请删除 ECHO 部分,以便真正执行复制命令;否则,请在此处发布程序显示的命令和磁盘上的文件列表... 那行得通,我删除了回声,它奏效了。现在,我如何将它合并到我的批处理中,因为我希望它连续运行?现在,我的批处理运行并每 10 秒检查一次源目录。我的批次中是否有一些地方可以让我将您的放入其中以无缝运行?

以上是关于批处理文件比较目录中相似的文件名,然后复制最后修改的文件并保存到其他目录的主要内容,如果未能解决你的问题,请参考以下文章

NANT 复制所有具有相似名称的文件

Windows批处理脚本:查找目录中最后一个文件夹的名称[关闭]

批处理文件以循环通过远程 Git 分支并将每个分支中的类似 CSV 文件复制到本地目录

VBA - 如何在 Excel 2010 的目录中获取最后修改的文件或文件夹

应用SVN比较文件定位修改

使用vi编辑器修改配置文件时,如何快速复制,粘贴多行文字内容