我可以立即使用do语法中指定的变量名吗?在批处理文件中



我想查找文件列表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语句中使用/rswich。。。

因此,我们必须对该代码的意图做出一些合理的假设。

提示:使用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

如果文件已被复制,则删除源文件,否则投诉并将其移动到目标树根。

最新更新