命令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
就会返回绝对路径。
答案 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
。