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

Getting notification from xcopy if file copy

我正在生成一个 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%

我在整个批处理代码中解释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= 选项,每行的第一个 space/tab 分隔字符串被分配给循环变量 I 并且忽略该行的其余部分。

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

XCOPYXCOPY最后一行输出的第一个space/tab分隔字符串是复制的文件数,也就是只复制一个文件01。所以最终在 FOR 循环执行完成后,环境变量 CopiedFilesCount 具有 01 作为值。

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

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

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