2010-08-09 5 views
2

임의의 디렉토리에 존재하는 배치 파일을 작성하려고하고 있는데, 그 위의 두 레벨 위에 새로운 디렉토리가 작성됩니다. 예를 들어, 여기에 배치 파일 :배치 파일 디렉토리 확장

w:\src\project\scripts\setup.bat 

을 만들 것입니다 :

w:\src\project.build 

나는 경로를 확장하는 방법을 알아낼 수 없습니다. 여기에 내가 현재 무엇을하고 무엇을 :

@set SCRIPT_DIR=%~dp0 
@set ROOT_DIR=%SCRIPT_DIR%\.. 
echo ROOT DIR: %ROOT_DIR% 
@set ROOT_DIR_NAME=%ROOT_DIR:~0,-1% 
@echo ROOT DIR NAME: %ROOT_DIR_NAME% 

을 그리고 이것은 생산 :

내가하고 싶었던 무엇
ROOT DIR: w:\src\w_dev1\scripts\\.. 
ROOT DIR NAME: w:\src\w_dev1\scripts\\. 

, ROOT_DIR_NAME는 (후행 슬래시없이) 디렉토리 자체로 얻을 수 있었다. 나는 이것을 해킹 할 수 있고 -1을 '..'에 대한 설명으로 바꿀 수 있다는 것을 알고 있지만 이것을 처리 할 수있는보다 깨끗한 방법은없는가요?

답변

4

라인 @set ROOT_DIR_NAME=%ROOT_DIR:~0,-1%은 변수 값에서 ony 1 문자를 제거합니다. 당신은 더 많은 것을 제거하고 싶습니다. ('스크립트'는 7 개가 있고 마지막에 \ '가 있습니다 ...). 설치하는 경로의 마지막 디렉토리로 항상 '스크립트'가 있습니까?

어쨌든 @set ROOT_DIR_NAME=%ROOT_DIR:~0,-11%을 사용하면 특정 사례에 적합합니다.

@set SCRIPT_DIR=%~dp0 
@pushd %script_dir% 
@pushd ..\.. 
@echo. current directory now is %cd% 
@set root_dir=%cd% 
@popd 
@popd 

이 디렉토리 이름의 길이는 독립적으로 작동합니다

그러나, 나는 당신이 더 일반적인 접근 방법을 사용하는 것이 좋습니다 것입니다.

pushd 명령은 디렉토리를 변경하고 (그 위치를 기억합니다) popd 명령은 pushd으로 기억 된 명령으로 돌아갑니다. %cd% 변수는 현재 드라이브 + 경로를 보유합니다.

+0

그것은'PUSHD % script_dir %'필요가있다 (맞습니까?)? 내 간단한 테스트 스크립트에서는 필요하지 않지만 어쩌면 내가 여기에서 놀고있는 곳을 모른다. – Pat

+0

@Pat : 다른 디렉토리에서 스크립트를 실행 중일 때'push % % script_dir % '해야합니다. 예를 들어'w : \ src'의 명령 프롬프트에서'project \ scripts \ setup.bat'을 실행할 수 있습니다. 또한 바로 가기에는 "대상"및 "시작"속성이 있으며 "시작"디렉토리는 taget 배치 파일과 같은 디렉토리 일 필요는 없습니다. – Grhm

3

당신은 정규 절대 경로로 상대 경로를 해결하기 위해 for 명령을 사용할 수 있습니다

@echo off 
set "SCRIPT_DIR=%~dp0" 
for %%P in ("%SCRIPT_DIR%..\..") do set "ROOT_DIR_NAME=%%~fP" 

이 스크립트는 스크립트의 조부모 디렉토리에 ROOT_DIR_NAME을 설정합니다. 이미 스크립트 디렉토리에 시작하고 이후

0

또는 로컬 서브 루틴

call :setvartopath ROOT_DIR_NAME "%~dp0\..\.." 
goto :eof 

:setvartopath 
set %1=%~f2