如何在不使用“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
。
命令 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
。