我正在生成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%
答案 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 输出的最后一行上的第一个空格/制表符分隔字符串是复制文件的数量,此处仅复制0
或1
的单个文件。所以最后在 FOR 循环执行完成后,环境变量CopiedFilesCount
的值为0
或1
。
将该值与命令 IF 的 GREATER THAN 运算符进行比较,以确定是否复制了文件,在这种情况下删除了另一个文件。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
del /?
echo /?
endlocal /?
for /?
if /?
rem /?
set /?
setlocal /?