如果文件复制,则从 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分隔字符串是复制的文件数,也就是只复制一个文件0
或 1
。所以最终在 FOR 循环执行完成后,环境变量 CopiedFilesCount
具有 0
或 1
作为值。
该值与命令 IF 的 GREATER THAN 运算符进行比较以确定文件是否被复制,在这种情况下另一个文件是已删除。
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
del /?
echo /?
endlocal /?
for /?
if /?
rem /?
set /?
setlocal /?
我正在生成一个 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分隔字符串是复制的文件数,也就是只复制一个文件0
或 1
。所以最终在 FOR 循环执行完成后,环境变量 CopiedFilesCount
具有 0
或 1
作为值。
该值与命令 IF 的 GREATER THAN 运算符进行比较以确定文件是否被复制,在这种情况下另一个文件是已删除。
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
del /?
echo /?
endlocal /?
for /?
if /?
rem /?
set /?
setlocal /?