好的,我提前道歉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“时如何停止...
非常感谢任何帮助。
答案 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