2011-09-26 1 views
0

현재 디렉터리 경로를 검색하고 해당 경로에 인접한 특정 파일이나 디렉터리를 찾으려고합니다. 예 : 스크립트의 현재 디렉토리가 C : \ Temp \ Dir1 \ Dir2 \ Dir3 \ Dir4 \ Dir5 \ Dir6 \ Test.bat이고 "jars"가 C : \ Temp \ jars을 찾은 다음 위쪽으로 검색하여 "jars"가있는 디렉토리를 찾으십시오.배치 또는 파일을 사용하여 현재 절대 경로를 검색하여 파일 또는 디렉토리를 찾으십니까?

이것은 구현 한 방법이지만 더 쉽고 간단한 방법이 있는지 궁금합니다.

@echo off 
SET TITLE=%~nx0 
SET SEARCHFOR=jars\Site.jar 
SET MYDIR=%~p0 
SET MYDRIVE=%~d0 
SET DIRCHAIN=%MYDIR:\= % 
:: searches first 4 levels of depth but can be increased if necessary 
ECHO Searching in directory chain: %MYDRIVE% %DIRCHAIN% 
FOR /F "tokens=1-4 delims= " %%G IN ("%DIRCHAIN%") DO (
    if exist %MYDRIVE%\%SEARCHFOR% (
    SET APPHOME=%MYDRIVE% 
    GOTO APPHOMESET 
) 
    if exist %MYDRIVE%\%%G\%SEARCHFOR% (
    SET APPHOME=%MYDRIVE%\%%G 
    GOTO APPHOMESET 
) 
    if exist %MYDRIVE%\%%G\%%H\%SEARCHFOR% (
    SET APPHOME=%MYDRIVE%\%%G\%%H\ 
    GOTO APPHOMESET 
) 
    if exist %MYDRIVE%\%%G\%%H\%%I\%SEARCHFOR% (
    SET APPHOME=%MYDRIVE%\%%G\%%H\%%I 
    GOTO APPHOMESET 
) 
    if exist %MYDRIVE%\%%G\%%H\%%I\%%J\%SEARCHFOR% (
    SET APPHOME=%MYDRIVE%\%%G\%%H\%%I\%%J 
    GOTO APPHOMESET 
) 
    GOTO FAILED 
) 
:FAILED 
ECHO Did not discover location of APPHOME containing %SEARCHFOR% 
ECHO Searched no deeper than %MYDRIVE%\%%G\%%H\%%I\%%J 
:APPHOMESET 
SET JREHOME=%APPHOME%\Javasoft\jre 
echo APPHOME is %APPHOME% 
echo JREHOME is %JREHOME% 
pause 
+0

가 참 쉽고 간단한 방법이 있습니다 : 유닉스'grep' 사용 '파이썬 또는 돈을 위해 os.walk' 얻을 4NT의 창 인스턴스를 다운로드하거나, 명령을 받아 들여야합니다. 분명히 부르면됩니다. DOS에서'dir/s'을 파일로 파이핑하고'find'를 사용하여 원하는 것을 얻을 수 있다고 생각할 수 있습니다. 그것은 확실히 적은 줄이지만 아마 더 오래 걸릴 것입니다. – Ben

+0

제안 해 주셔서 감사합니다. 그러나이 스크립트의 요점은 APPHOME 및 JREHOME을 동적으로 검색 할뿐만 아니라 사전 요구 사항없이 모든 Windows 시스템에서 실행할 수 있다는 것입니다. 전형적인 재귀 검색은 이것을 효율적으로 수행하지 않을 것입니다. – djangofan

답변

0

다음과 같이 아이디어는 대략 다음과 같습니다

  1. 는 현재 작업 디렉토리와 배치 스크립트의 경로를 가져옵니다.

  2. 하위 디렉토리 이름을 연결하십시오.

  3. 결과 경로가 있으면 경로를 반환하고 종료하십시오.

  4. 현재 작업 디렉토리가 본질적으로 루트 디렉토리 인 경우 Not found을 반환하고 종료하십시오.

  5. 현재 작업 디렉토리의 상위 디렉토리를 가져 와서 2 단계부터 반복하십시오.

여기 간다 :

@ECHO OFF 

SET "subdir=%~1" 
SET "dir=%~f0" 

:loop 
    CALL :getdir "%dir%" 

    IF EXIST "%dir%\%subdir%\" (
    ECHO %dir%\%subdir% 
    GOTO :EOF 
) 

    IF "%dir:~-1%" == ":" (
    ECHO Directory "%subdir%" not found. 
    GOTO :EOF 
) 
GOTO loop 

:getdir 
SET "dir=%~dp1" 
SET "dir=%dir:~0,-1%" 
+0

완벽하게 작동했습니다. 고맙습니다! 놀라운 일. 나는 과거에 % ~ dp1을 시도했지만 작동하도록 만들 수 없다고 생각합니다. 왜냐하면 for 루프 또는 무언가 내에서했기 때문입니다. – djangofan

관련 문제