【问题标题】:How to walk through a directory tree returning relative paths without using `forfiles`?如何在不使用`forfiles`的情况下遍历返回相对路径的目录树?
【发布时间】:2015-11-26 00:27:17
【问题描述】:

命令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 在给出开关/S 后立即返回绝对路径。

【问题讨论】:

  • 这是特定于 Windows/batch 的吗?
  • 是的,它与Windows相关(我会添加标签);它不一定与批处理有关,因为您可以直接在命令行解释器中执行所有命令(这就是我所做的,请参阅我的 for %L 语法,如果在批处理中使用,则应该读取 %%L);
  • 感谢您在不说明原因的情况下投反对票!

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


【解决方案1】:

你可以试试

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

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

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

【讨论】:

  • 使用xcopy,@MCND 的好主意!对我来说另一个好处是返回了一个没有目录的纯文件列表。
【解决方案2】:

基于@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 交换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2014-09-23
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多