在 for 循环中使用 robocopy 比较文件

在 for 循环中使用 robocopy 比较文件

我想要解决的问题: 将一个目录中的文件与子目录中的文件进行比较。如果它们匹配,则删除顶级目录中的文件。这是针对 Windows 的,我想使用 Windows 批处理命令。如果文件不存在,脚本将退出。

例如: c:\temp 包含 baz_foo.exe c:\temp\bar 包含 foo.exe

尝试将 foo.exe 复制到 c:\temp\bar,但 robocopy 注意到它们是相同的,因此它将退出并给出返回代码 0。https://blogs.technet.microsoft.com/deploymentguys/2008/06/16/robocopy-exit-codes/

伪代码:

@echo off
setlocal enabledelayedexpansion
SET ARCHIVEDIR=c:\temp\bar

FOR %%F in ('*baz_foo*.exe') DO SET (
    ROBOCOPY . %ARCHIVEDIR% %%F

if errorlevel 0 goto nocopy
if errorlevel 1 goto copy

:nocopy
echo Files are identical
goto exit

:copy
echo files different
goto exit

)

:exit
Call nextfile.bat

澄清:请注意,我不需要复制到 bar 的文件,我只是想知道它们是否相同或不同。如果相同,则从 c:\temp 中删除并转到下一个文件;在找到所有文件后,调用不同的脚本。

答案1

我相信足球俱乐部如果您只是想比较文件,命令在这里会更好用;在循环中加上if exist。可能看起来像这样:

@echo off

set "top=c:\temp"
set "sub=%top%\bar"

for /r "%sub%" %%A in (*) do (
    if exist "%top%\%%~nxA" fc "%%A" "%top%\%%~nxA" > nul
    if not errorlevel 1 (
        del /f /q "%top%\%%~nxA"
        del /f /q "%%A"
    )
)

Call nextfile.bat

这将查看 中的所有文件c:\temp\bar并将每个文件分配给参数%%A;对于每次循环迭代,它将查看 参数%%~nxA的文件名(包括扩展名 ; )是否%%A存在于c:\temp- 中,如果存在,它将比较文件并将FC其输出到,nul这样它就不会在窗口中显示结果。之后,它确定errorlevelif not errorlevel 1在这里使用的 - ,因此它只适用于相同的文件,因为有时errorlevel 0在这种情况下会给你一个误报而不进行一些调整。如果它通过这个测试,它将从 和 中删除那些匹配的文件c:\tempc:\temp\bar确实,errorlevels除了01之外还有其他可能FC(可以是-12),但 for 循环已经确定它不可能,2因为文件必须存在于两个目录中才能执行任何操作,并且-1由于同样的原因也大多被排除。希望这能实现你想要的 - 如果我误解了你的要求,请发表评论。

相关内容