如何在不使用`forfiles`的情况下遍历返回相对路径的目录树?

时间:2015-08-31 21:26:59

标签: windows for-loop cmd path relative-path

命令forfiles提供了递归遍历目录树的功能,每次迭代在使用变量@relpath时返回相对于给定根目录的路径(每个项目前缀为.\ },不幸的是双引号):

forfiles /S /P "D:\data" /S /M "*" /C "cmd /C echo @relpath"

有没有办法在没有forfiles的情况下做到这一点(但没有优先考虑周围的引号)? 实际上我想避免任何自编码的程序集或重建相对路径,如果可能的话。

以下两行仅提供绝对路径(甚至将\\.附加到根路径,或者使用.\为掩码添加前缀不会改变任何内容:

for /R "D:\Data" %L in ("*.*") do echo %L
cd /D "D:\Data" & for /R "." %L in ("*.*") do echo %L

同样使用dir /S /B "D:\Data"声明解析for /F的输出并不能达到我想要的效果,因为只要给出切换dir/S就会返回绝对路径。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用

xcopy /l /s . "%temp%" | find ".\"

不,没有复制,我们只是请求要复制的文件列表(/l开关)。

包含find命令只是为了删除具有匹配文件数量的页脚。

答案 1 :(得分:-1)

基于@ MCND的answer,我提供了我将要使用的完整代码(从根目录开始):

for /F "tokens=2 delims=:" %L in ('xcopy /L /S /E /I /Y /C "*.*" "%TEMP%"') do echo %L

输出是相对于当前目录的纯文件路径列表。

由于source是文件模式*.*而不是此处的当前目录.,因此每个列出的相对文件路径都以当前驱动器为前缀(例如,D:;没有更多.\)。这就是我使用for /F选项delims=:的原因。每个剩余行中不会有任何其他冒号,因此使用tokens=2是安全的。此for /F应用会过滤掉xcopy的摘要行,因此不需要额外的find。每行都以驱动器号开头,因此默认的eol=;选项无关紧要。

要在批处理文件中使用此功能,请通过%L交换%%L