有几个问题:
- 既然你试图移动目录,由
for /R
列举目录树被修改。 for
/for /R
但是不提前枚举目录(树),因此可能会出现意外的结果 - 有关该问题的详细信息,请参阅以下问题:At which point does for
or for /R
enumerate the directory (tree)?。
for
或for /R
仅在集合中给出通配符(即圆括号之间的部分)的情况下才访问文件系统。
- 这是不完全清楚正是你想要完成的任务:
- 应该在冲突项目的情况会怎么样呢?覆盖他们或不?合并(子)目录?
- 如果是
E:\TEST\TEST
,您是否希望E:\TEST
立即移动,因此E:\
?处没有更多目录TEST
?.
- 需要注意的是不能使用的
move
命令,因为它移动目录时引起的麻烦和目标目录已经存在(发生Access is denied.
错误)。
项目可以通过一个很好的变通使用for /F
和dir
解决:
for /F "eol=| delims=" %%I in ('dir /B /S /A:D "E:\TEST"') do echo(%%I
这种强制进行枚举(读取)循环迭代开始前,整个目录树。
然而,这引起类似项目2.另一个问题:当一个名称,给出了dir
与现存的给定位置的目录,其内容被返回,而不是该名称匹配的所有项目。我的意思是这样的:
dir /B /S /A:D "E:\"
回报在E:\
递归(/S
)所有目录(/A:D
);
dir /B /S /A:D "E:\file.ext"
返回所有名为file.ext
的目录,即使存在名为E:\file.ext
的文件;
- 但:
dir /B /S /A:D "E:\TEST"
全部返回子-目录E:\TEST
,但不是E:\TEST
本身;
- 但是:
dir /B /S /A:D "E:\TEST*"
返回所有目录开始与TEST
,还在E:\
中的那些;与名称TEST
完全匹配,需要额外的过滤(使用findstr
);
这一切都意味着:
for /F "eol=| delims=" %%I in ('dir /B /S /A:D "E:\TEST*" ^| findstr /I /E /C:"\\TEST"') do echo(%%I
项目只能由你来解决,而是要提供一个完整的答案,我做一些假设:
- (子)目录合并后,已存在的项目将被覆盖,恕不另行通知;
- 父目录优先于子目录(例如
for /R
和dir /S
的行为,因为对于树中的每个分支,它们总是从较高的目录级别降到较低的级别);
项目4.可以通过使用命令robocopy
与选项/MOVE
代替move
一起解决。
所以这里是最后的脚本:
@echo off
rem // Define constants here:
set "_PATH=E:\"
set "_NAME=TEST"
set "_DEST=E:\FOUND"
2> nul mkdir "%_DEST%"
for /F "eol=| delims=" %%I in ('
dir /B /S /A:D "%_PATH%\%_NAME%*" ^| findstr /I /E /C:"\\%_NAME%"
') do (
> nul robocopy "%%I" "%_FOUND%\%_NAME" /E /MOVE
)
的> nul
部分旨在抑制进度和日志信息,并在案件E:\TEST\TEST
压制The system cannot find the path specified.
错误是试图移动虽然它不再因为父母E:\TEST
已经被移动过。
'for' /'for/R'仅在'()'中的部件/集合中存在通配符时访问文件系统;除非你提供'/ D'开关,否则''''为/ R'列举文件... – aschipfl
在'set'命令中删除'='等号后的空格。此外,使用'set“Destination = E:\ FOUND”'确保没有不需要的尾部空间。 – JosefZ