【问题标题】:Getting notification from xcopy if file copy如果文件复制,则从 xcopy 获取通知
【发布时间】:2017-07-30 06:23:41
【问题描述】:

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

【问题讨论】:

  • for /F %%a in ('xcopy "%SOURCEFILE%" "%DESTDIR%" /c /d /q /y') do set "files=%%a"if %files% gtr 0 echo File updated
  • @Aacini 太完美了。我从来没有完全理解 FOR's in Batch,但效果很好。谢谢

标签: windows batch-file xcopy


【解决方案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 作为最后一行的信息消息,其中包含在开始时复制的文件数,即使没有复制任何内容或出现错误也是如此发生了。

在后台单独的命令进程中执行 XCOPY 的命令 FOR 捕获此输出以处理 STDOUT 并逐行处理它。

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

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

XCOPY 输出的最后一行的第一个空格/制表符分隔的字符串是复制文件的数量,这里只复制一个文件01。所以最后在 FOR 循环执行完成后,环境变量 CopiedFilesCount 具有 01 作为值。

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

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

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

【讨论】:

  • Mofi 的解释很好,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多