0

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

我的目录结构如下所示:A 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”时如何停止......

任何帮助是极大的赞赏。

4

2 回答 2

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!

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

编辑

实际上,使用 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!

于 2013-08-26T14:51:34.757 回答
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
于 2013-08-26T13:43:02.040 回答