批处理文件,用于搜索当前目录树中的目录

时间:2013-05-27 22:21:20

标签: batch-file

我正在尝试找到一个存在于当前目录之上的目录,批处理语法让我失明。例如,假设我在:

C:\ dev的\项目\ folder1中\的projectname \ batch.bat

我想在这里找到我的共享libs文件夹:

C:\ dev的\共享

然后我需要将其设置为可以重用的变量。我正在做以下事情,但我觉得我已经达到了将我的头贴在墙上不再值得的阶段:

@setlocal enableextensions enabledelayedexpansion
@echo off
set shareddir=%~dp0
:loop
  set shareddir=!shareddir!..\
  set sharedir2=!shareddir!shared\    
if not exists (%sharedir2%) goto loop
ECHO shareddir found = %sharedir2%

提前致谢。

3 个答案:

答案 0 :(得分:2)

我认为您的方法会将路径 relative 返回到批处理文件,如下所示:

c:\dev\projects\folder1\projectname\..\..\..\shared

请尝试使用此方法:

@setlocal enableextensions enabledelayedexpansion
@echo off
pushd "%~dp0"
:loop
   cd ..
   if not exist shared goto loop
set sharedDir=%cd%\shared
popd
ECHO shareddir found = %sharedDir%

答案 1 :(得分:0)

@setlocal enableextensions enabledelayedexpansion
@echo off
set shareddir=%~dp0
:loop
  set shareddir=!shareddir!..\
  set sharedir2=!shareddir!shared\
if not exist "!sharedir2!" goto loop
ECHO shareddir found = !sharedir2!
endlocal

在这种情况下,不需要延迟扩展,但无论如何...... 检查存在使用IF EXIST但不是if exists(命令提示符不关心gramar :-))并使用引号而不是括号(对于带有空格的路径,它是必需的)。

答案 2 :(得分:0)

另一种方法。如果找不到共享文件夹,我已经添加了一个额外的测试来防止无限循环。

@echo off
setlocal
set "sharedDir=%~dp0"
:loop
for %%F in ("%sharedDir%\..") do if not exist "%%~fF\shared" (
  if %sharedDir% neq %%~fF (
    set "sharedDir=%%~fF"
    goto :loop
  ) else set "sharedDir="
) else set "sharedDir=%%~fF\shared"

:: Display the value. It will be undefined if shared folder not found.
set sharedDir