【问题标题】:Recursive directory processing in a BAT file with a twistBAT文件中的递归目录处理
【发布时间】:2013-08-28 23:55:53
【问题描述】:

好的,我提前为 a) 使用旧的、糟糕的技术(BAT 文件)和 b) 问什么似乎是多余的问题表示歉意。在这种特殊情况下,我被允许使用的技术受到限制,在查看了有关该主题的数十篇帖子后,我找不到任何可以适应我需要的东西。

我的目录结构如下所示: 一种 乙 C D 等等... XYZ 更多文件夹

我的 BAT 文件位于此文件系统之外。我需要从“C”级开始检查它,并且需要找到“XYZ”目录。 C 和 XYZ 之间的文件夹可以具有变量名称,具体取决于创建文件的环境。我需要得到一个字符串,该字符串包含从 C 到 XYZ 的目录名称(即“C\D\E\F....\XYZ”),我可以将其放入变量中,以便在我的 BAT 文件完成时我可以引用变量并运行另一个命令。

我查看了使用 FIND 和 FOR 的帖子,但我似乎无法弄清楚如何 a) 将字符串限制为起始目录(例如,当我将 FOR 与 DIR 结合使用时,我得到“A\B\C ...”)以及当我到达“XYZ”时如何停止...

非常感谢任何帮助。

【问题讨论】:

  • “老,蹩脚”?同意,但仍然有用且非常轻量级。

标签: windows recursion batch-file directory


【解决方案1】:

对于一个)问题:

FOR /F "TOKENS=*" %%d IN ('DIR A\B\C\XYZ /S /AD /B') DO SET variable=%%d

对于 a) 和 b) 问题:

FOR /D /R "A\B\C" %%d IN (*.*) DO IF /I "%%~nxd"=="XYZ" (SET variable=%%d& GOTO :EOF)

但这会退出批处理脚本,所以你需要:

... your batch code
CALL :GET_XYZ
... your batch code
GOTO :EOF

:GET_XYZ
FOR /D /R "A\B\C" %%d IN (*.*) DO IF /I "%%~nxd"=="XYZ" (SET variable=%%d& GOTO :EOF)
ECHO XYZ not found!
GOTO :EOF

【讨论】:

  • 以上所有代码在输出中都包含 A\B\C\...,但是 OP 希望输出以 C\...
【解决方案2】:

这应该适用于大多数情况:

@echo off
setlocal enableDelayedExpansion

set "root=c:\a\b\c"
set "target=xyz"

for %%R in ("%root%") do for /f "delims=" %%F in (
  'dir /b /s /ad "%root%\%target%"'
) do (
  set "fullPath=%%F"
  set "relpath=!fullPath:%%~dpR=!"
)
echo !relpath!

如果您的任何路径包含!=,它可能会失败。有解决方案,但代码要复杂得多。

编辑

实际上,使用 FORFILES 有一个相对简单的解决方案,它应该适用于所有情况。 (假设您的 Windows 版本有 FORFILES)

@echo off
setlocal disableDelayedExpansion

set "root=c:\a\b\c"
set "target=xyz"

for /f "delims=" %%F in (
  'forfiles /p "%root%" /m "%target%" /s /c "cmd /c if @isdir==TRUE echo @relpath"'
) do set "relpath=%%~F"
for %%R in ("%root%") do set "relpath=%%~nxR%relpath:~1%"
echo %relpath%

唯一的限制是如果您的结果包含像& 这样的有毒字符,则代码必须稍微更改。在这种情况下,您需要在最后的 ECHO 语句中添加引号,或者在最后启用延迟扩展并使用 echo !relpath!

【讨论】:

  • 如何在 For 命令范围之外访问 fullPath?这是我在尝试使用延迟扩展时经常遇到的问题。找到完整路径后,我需要在同一 BAT 文件中的后续代码中使用它吗?
  • 编辑 - 我简化了我的第一个解决方案,并对其进行了修改以设置变量
  • 这可以在我的本地 PC 上完美运行。我将它推送到它需要运行的 Web 服务器,我得到一个“指定的目录不存在”。第一个 FOR 命令出错。将它推送到服务器时,我可能做了一些愚蠢的事情。谢谢。
  • OMG - 当我读到你的问题时,在我看来你想要相对路径:像“C\D\E\F....\XYZ”这样的字符串。获取完整路径很简单。
  • 编辑后的版本获取的是相对路径,而不是完整路径。这就是我需要的。我唯一需要调整的是,如果我的根目录是 A\B\C,我不希望我的相对路径以“C”开头,它应该是“D\E\F...XYZ”。我应该能够弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
相关资源
最近更新 更多