批处理文件合并另一个批处理,将目录中的修改文件复制到另一个目录

Posted

技术标签:

【中文标题】批处理文件合并另一个批处理,将目录中的修改文件复制到另一个目录【英文标题】:batch-file incorporate another batch that copies modified files in directory to another directory 【发布时间】:2012-11-29 17:49:33 【问题描述】:

这是我想出的,但是我无法从 Aacini 在另一篇文章中提供的代码中获得正确的 xcopy 引用。 cmd控制台会说找不到文件“!lastName!!baseExt!”然后显示已复制 0 个文件。这不是复制,因为我认为 xcopy 语法不允许替换 xcopy 之后的“源”“目录”关系。

任何帮助将不胜感激。谢谢

@Echo Off
:: variables
set drive=C:\Users\me\Desktop\Test Source Folder
set backupcmd=xcopy /m /s /c /d /e /h /i /r /y /exclude:AutoFileCopy_Rev1.bat

set basename=
for %%a in ("C:\Users\me\Desktop\Test Source Folder") 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
         %backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Source Folder\!    baseName!!baseExt!"
         set baseName=%%~Na
         set baseExt=%%~Xa
         set lastName=%%~Na
      )
   )      
)
rem Copy last set

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 JobBoss files...
::%backupcmd% "C:\Users\john.weakley\Desktop\Test Source     Folder" "C:\Users\me\Desktop\Test Destination Folder\"

::CALL "C:\users\me\Desktop\Test Source Folder\Test.bat"

ECHO ___ Checking for new file revisions...
%backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Source Folder\!baseName!!    baseExt!"



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】:

您需要启用延迟扩展才能支持!VAR! 语法。

将您的第一行更改为:

@echo off & setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

【讨论】:

好的,现在它显示“无法执行循环复制”。这是否意味着我的代码有问题? 而不是实际尝试进行复制,echo 将运行的命令,如@echo %backupcmd%。它向你展示了什么? (另外,检查“检查新文件修订”中!basenName!! 和`baseext!'之间的空格 读取实际的文件夹名称。 xcopy 不知道它应该做什么。它认为您想将文件从源文件夹复制到源文件夹中,当然这是不允许的。 IOW,当它们都在同一个地方时,您不能将“测试源文件夹”复制到“测试源文件夹”,并且就您提供的 xcopy 命令而言,它们认为它们是相同的。 这是一个单独的问题,应该作为一个问题提交。 (每个帖子的一个问题是这里的一般规则,您最初的问题是关于修复您的“找不到文件“!lastName!baseExt!””问题。将else循环分离到它自己的子程序中完全是一个不同的问题。(另一个问题可以短得多,例如一个问题和一个简短的if ... ( something) else ( something else ),并带有返回该问题的链接以获取更多信息。 不知道。 /Y 只是抑制 File exists. Overwrite? 提示。我能看到的最接近文件/目录的可能是/I,但你已经在使用它了。 (请参阅命令提示符下的xcopy /?。)

以上是关于批处理文件合并另一个批处理,将目录中的修改文件复制到另一个目录的主要内容,如果未能解决你的问题,请参考以下文章

循环批处理文件,用于将来自不同文件夹的多个文本文件合并到另一个不同文件夹中的一个文本文件

如何编写 Windows 批处理脚本以从目录中复制最新文件?

合并两个目录,保留任何同名文件

如果文件不匹配,则递归地将一个目录复制到另一个目录

bat批处理复制N天前的文件夹及里面的文件到其他目录?

将多个文本文件合并为一个