我想创建一个搜索多个目录的脚本,例如: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"
答案 0 :(得分:0)
有几个问题:
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
,那么TEST
处的目录E:\
就不再有了。move
命令,因为它在移动目录时会导致问题并且目标目录已存在(发生Access is denied.
错误)。项目 1。可以通过使用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:\"
以/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*"
会返回所有目录开头 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
项 3。只能由您解决,但为了提供完整的答案,我做了一些假设:
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
部分旨在抑制进度和日志消息,并在尝试移动The system cannot find the path specified.
的情况下抑制E:\TEST\TEST
错误,尽管它自父E:\TEST
以来不再存在1}}之前已被移动过。