2016-12-02 74 views
0

我想创建一个脚本来搜索多个目录“eg:TEST”并将其移动到文件夹中的特定位置。我曾尝试使用下面的脚本。它显示该文件夹的位置 例如:批处理脚本搜索多个目录并将其移动到特定文件夹

"E:\Example\TEST" 
"E:\TEST\TEST" 

请查看我已创建的脚本。谁能帮忙?

@echo off 

set filename=TEST 

set searchPath=E:\ 

set Destination= E:\FOUND 

FOR /R "%searchPath%" %%a in (%filename%) DO (
    IF EXIST "%%~fa" (
     echo "%%~fa" 
    ) 
) 

move "%%~fa" "%Destination%" 
+1

'for' /'for/R'仅在'()'中的部件/集合中存在通配符时访问文件系统;除非你提供'/ D'开关,否则''''为/ R'列举文件... – aschipfl

+1

在'set'命令中删除'='等号后的空格。此外,使用'set“Destination = E:\ FOUND”'确保没有不需要的尾部空间。 – JosefZ

回答

0

有几个问题:

  1. 既然你试图移动目录,由for /R列举目录树被修改。 for/for /R但是不提前枚举目录(树),因此可能会出现意外的结果 - 有关该问题的详细信息,请参阅以下问题:At which point does for or for /R enumerate the directory (tree)?
  2. forfor /R仅在集合中给出通配符(即圆括号之间的部分)的情况下才访问文件系统。
  3. 这是不完全清楚正是你想要完成的任务:
    • 应该在冲突项目的情况会怎么样呢?覆盖他们或不?合并(子)目录?
    • 如果是E:\TEST\TEST,您是否希望E:\TEST立即移动,因此E:\?处没有更多目录TEST ?.
  4. 需要注意的是不能使用的move命令,因为它移动目录时引起的麻烦和目标目录已经存在(发生Access is denied.错误)。

项目可以通过一个很好的变通使用for /Fdir解决:

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 /Rdir /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已经被移动过。

相关问题