用于搜索多个目录并将其移动到特定文件夹的批处理脚本

时间:2016-12-02 11:02:43

标签: batch-file

我想创建一个搜索多个目录的脚本,例如:TEST"并将其移动到文件夹中的特定位置。我试过使用下面的脚本。它显示文件夹位置 例如:

private class ProcessData {        
    private final Map<String, List<?>> map = new HashMap<String, List<?>>();
    int counter;

    public ProcessData(Data data) {
        map.put("trueOrFalse", data.trueOrFalse);
        map.put("string", data.string);
        counter = data.counter;
    }

    public String someMethodToGenerateReturnData() {
    // some code here to make use of the Data collected. Will basically use map to construct the return String
    }
}

请检查我创建的脚本。有人可以帮忙吗?

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

1 个答案:

答案 0 :(得分: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,那么TEST处的目录E:\就不再有了。
  4. 请注意,无法使用move命令,因为它在移动目录时会导致问题并且目标目录已存在(发生Access is denied.错误)。
  5. 项目 1。可以通过使用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:\"/A:D递归(E:\)返回所有目录(/S);
    • 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*"会返回所有目录开头 TESTE:\;要与名称TEST完全匹配,需要进行额外过滤(使用findstr);

    这一切意味着:

    for /F "eol=| delims=" %%I in ('dir /B /S /A:D "E:\TEST*" ^| findstr /I /E /C:"\\TEST"') do echo(%%I
    

    3。只能由您解决,但为了提供完整的答案,我做了一些假设:

    • (子)目录已合并,现有项目将被覆盖,恕不另行通知;
    • 父目录优先于子目录(如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部分旨在抑制进度和日志消息,并在尝试移动The system cannot find the path specified.的情况下抑制E:\TEST\TEST错误,尽管它自父E:\TEST以来不再存在1}}之前已被移动过。