带有扭曲的BAT文件中的递归目录处理

时间:2013-08-26 13:14:25

标签: windows recursion batch-file directory

好的,我提前道歉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“时如何停止...

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

@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!

答案 1 :(得分:0)

对于a)问题:

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