我想要解决的问题: 将一个目录中的文件与子目录中的文件进行比较。如果它们匹配,则删除顶级目录中的文件。这是针对 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
这样它就不会在窗口中显示结果。之后,它确定errorlevel
我if not errorlevel 1
在这里使用的 - ,因此它只适用于相同的文件,因为有时errorlevel 0
在这种情况下会给你一个误报而不进行一些调整。如果它通过这个测试,它将从 和 中删除那些匹配的文件c:\temp
。c:\temp\bar
确实,errorlevels
除了0
和1
之外还有其他可能FC
(可以是-1
或2
),但 for 循环已经确定它不可能,2
因为文件必须存在于两个目录中才能执行任何操作,并且-1
由于同样的原因也大多被排除。希望这能实现你想要的 - 如果我误解了你的要求,请发表评论。