我想查找文件列表PATH1如果PATH2上有相同名称的文件,则覆盖它。
@echo off
SET PATH1="FIND_PATH"
SET PATH2="OVERWRITE_PATH"
for /f "delims=" %%A in ('dir /b %PATH1%') do (
dir /s /b /r %PATH2% | find /i "%%A" > list.txt
SET /p PATH3<=list.txt
move %PATH1%%%A %PATH3%
)
在第7行,如果可能的话,最好将其存储在一个变量中,而不必经过在中间的list.txt。
我表演";ECHO%PATH3%";在for语法之外,输出最后保存的项。但我表演";ECHO%PATH3%";在do语法内部,输出一个错误。
我该怎么办。
thx。
以下是我对您的代码的分析:
for /f "delims=" %%A in ('dir /b %PATH1%') do (
rem %%A contains filename + extension of each file AND DIRECTORY in path1
dir /s /b /r %PATH2% | find /i "%%A" > list.txt
rem LIST.txt contains full pathnames of all filenames AND DIRECTORIES
rem where "%%A" forms part of the full pathname
SET /p PATH3<=list.txt
rem PATH3 contains the first line of list.txt
move %PATH1%%%A %PATH3%
rem move `path1%%A` (a file or directoryname - but without the `` separator)
rem to the first (probably filename) found
)
评论:在过去40年中,我第一次使用批处理,在dir
语句中使用/r
swich。。。
因此,我们必须对该代码的意图做出一些合理的假设。
提示:使用set "var=value"
设置字符串值,这样可以避免尾部空格引起的问题。不要指定"
或终端反斜杠或空格。根据元素构建路径名——与直觉相反,这可能会使过程更容易。如果使用语法set var="value"
,则引号将成为指定值的一部分。
@echo off
SET "PATH1=FIND_PATH"
SET "PATH2=OVERWRITE_PATH"
for /f "delims=" %%b in ('dir /b /a-d "%PATH1%"') do (
for /f "delims=" %%u in ('dir /s /b /a-d /r "%PATH2%%%b" 2^>nul') do (
ECHO move "%PATH1%%%A" "%%u"
)
)
[1] 更改为更好的set
语法
[2]更倾向于避免将ADFNPSTXZ(在任何一种情况下)作为元变量(循环控制变量),因为ADPNPSTXZ是元变量修饰符,可能会导致难以查找的错误(请参阅文档提示中的for/f
)
[3]包含/a-d
以从dir
列表中排除目录名
[4]在内部for
的文件掩码中包含%%b
以仅在目标目录树中搜索该确切名称
[5]如果在目标目录中找不到与文件名匹配的文件,则2^>nul
将不显示错误消息。需要插入符号(^
)来告诉cmd
>
是dir
命令的一部分,而不是for
[6]使用所需的分隔符将找到的文件名(%%b
)附加到源目录名称
[7]%%u
将包含目标目录树中匹配文件的完整路径名
[8]生成的命令仅为echo
,用于验证。验证后,删除echo
关键字,即可实际执行move
未测试
在应用于实际数据之前,始终根据测试目录进行验证
其效果是在源目录中查找所有文件名,并在目标目录树中的所有匹配文件名上查找move
。
逻辑FLAW
a";移动";命令将在目标树中的第一个CCD_ 25上移动文件CCD_。然后源文件不再存在(因为它被移动了),所以如果第二个a.txt
位于目标树中,那么move
将失败。
考虑这个进一步的修改:
@echo off
SET "PATH1=FIND_PATH"
SET "PATH2=OVERWRITE_PATH"
for /f "delims=" %%b in ('dir /b /a-d "%PATH1%"') do (
set "moved="
for /f "delims=" %%u in ('dir /s /b /a-d /r "%PATH2%%%b" 2^>nul') do (
set "moved=y"
ECHO COPY "%PATH1%%%A" "%%u"
)
if defined moved (
ECHO del "%PATH1%%%A"
) else (
ECHO "%PATH1%%%A" - no matches in tree "%PATH2%" found
ECHO MOVE "%PATH1%%%A" "%PATH2%"
)
)
此更改将找到的每个源文件的moved
设置为nothing,然后如果在目标树中找到任何匹配的文件名,则将其设置为y
。
如果文件已被复制,则删除源文件,否则投诉并将其移动到目标树根。