如果文件复制,从xcopy获取通知

时间:2017-07-30 06:23:41

标签: windows batch-file xcopy

我正在生成Windows批处理脚本来复制文件,只有在更新源时。如果文件已更新,我想删除另一个文件。

问题在于,当文件更新发生时,我无法找到一种简单的方法来触发事件。

我想过使用%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%

1 个答案:

答案 0 :(得分: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 并逐行处理。< / p>

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

循环变量I的当前值在每个已处理的行上分配给环境变量CopiedFilesCount,以替换其先前的值。

XCOPY 输出的最后一行上的第一个空格/制表符分隔字符串是复制文件的数量,此处仅复制01的单个文件。所以最后在 FOR 循环执行完成后,环境变量CopiedFilesCount的值为01

将该值与命令 IF GREATER THAN 运算符进行比较,以确定是否复制了文件,在这种情况下删除了另一个文件。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

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