2017-07-30 40 views
3

我正在生成Windows批处理脚本来复制文件,仅当更新源时。如果文件被更新,我想删除另一个文件。从xcopy获取通知(如果文件副本)

问题是,我无法找到发生文件更新时触发事件的简单方法。

我想到了使用%ERRORLEVEL%,但是这给了0是否复制文件。

我也想过将xcopy输出保存到一个文本文件然后处理这个文件,但是这对于这样一个简单的任务似乎有点不切实际?

任何其他想法?

代码到目前为止

SET SOURCEFILE=%CD%\source.txt 
SET DELFILE=%CD%\toDelete.txt 
SET DESTDIR=%WINDIR%\Deployment\ 

xcopy "%SOURCEFILE%" "%DESTDIR%" /c /d /q /y 

REM IF File is updated, delete %DELFILE% 
+0

'for/F %% a in('xcopy'%SOURCEFILE%“”%DESTDIR%“/ c/d/q/y')do set”files = %% a“'and'if %files%gtr 0 echo文件已更新' – Aacini

+0

@Aacini完美无缺。我从来没有完全理解FOR的批处理,但是效果很好。谢谢 – EcksMedia

回答

1

我解释张贴Aacini对整批产品代码的命令行中使用的方法:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

set "SourceFile=source.txt" 
set "DeleteFile=toDelete.txt" 
set "DestinationDirectory=%SystemRoot%\Deployment\" 

for /F %%I in ('%SystemRoot%\System32\xcopy.exe "%SourceFile%" "%DestinationDirectory%" /C /D /Q /Y 2^>nul') do set "CopiedFilesCount=%%I" 

if %CopiedFilesCount% GTR 0 del "%DeleteFile%" 

rem Add here more command lines using one of the 3 environment variables define above. 
endlocal 

首先,它是在复制一个文件与XCOPY非常重要目标目录路径以反斜杠结尾,否则XCOPY会提示目标是目录还是文件。

XCOPY这里使用的总输出处理STDOUT作为最后一行在甚至已经开始被复制与文件数量的信息消息时没有被复制或时发生错误。

命令FOR在背景单独的命令处理执行XCOPY捕获这个输出处理STDOUT和逐行处理它。

使用此处使用的默认选项忽略以分号开头的空行和行,并且没有eol=选项。其他行的处理方式是将每行分割为由空格或水平制表符分隔的字符串,因为没有delims=选项,所以使用此处使用的默认分隔符。由于没有使用tokens=选项,因此每行的第一个空格/制表符分隔的字符串被分配给循环变量I,该行的其余部分将被忽略。

循环变量I的当前值在每条处理线上分配给环境变量CopiedFilesCount替换其以前的值。

第一空间/制表符分隔的上最后一行输出串由XCOPY是复制的文件的数目是在这里复制只是一个单一文件或者01。因此,最后在FOR循环执行完成后,环境变量CopiedFilesCount的值为01

值与GREATER THAN操作员命令相比IF以确定该文件是在这种情况下,其他文件被删除复制。

为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • del /?
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
+0

这是一个很好的解释Mofi,非常感谢。 – EcksMedia