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

How to walk through a directory tree returning relative paths without using `forfiles`?

命令 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

还用 for /F 语句解析 dir /S /B "D:\Data" 的输出并不能满足我的要求,因为 dir returns 绝对路径一旦切换 [=给出了 22=]。

你可以试试

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

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

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

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

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

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

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

要在批处理文件中使用它,请将 %L 替换为 %%L