2010年4月17日 星期六

透過bat分析目前的路徑

%cd%
當前目錄

%~dp0
目前正在運行的批次檔的所在目錄

%~sdp0
目前正在運行的批次檔的所在的目錄的短名稱

main.bat

@echo off 
SET MYPATHCOPY=%CD%
:search
for /f "delims=\ tokens=1,*" %%p in ("%MYPATHCOPY%") do (
@echo %%~p
SET MYPATHCOPY=%%~q\
)
if "%MYPATHCOPY%"=="\" goto done
goto search
:done
pause

可以把目前的路徑以"\"為分隔,把每一個目錄列出來

可以得知目前所在的資料夾,與目前所在的資料夾的路徑
main.bat
@echo off 
SET Count=0
SET MYPATHCOPY=%cd%
:search
for /f "delims=\ tokens=1,*" %%p in ("%MYPATHCOPY%") do (
@echo %%~p
set /A Count=%Count%+1
SET MYPATHCOPY=%%~q\
)
if "%MYPATHCOPY%"=="\" goto done
goto search
:done
echo %Count%
set /A PreCount=%Count%-1

SET MYPATHCOPY=%cd%
SET index=0
:search1
for /f "delims=\ tokens=1,*" %%p in ("%MYPATHCOPY%") do (
set /a index=%index%+1
echo %index%
if %index% LSS %PreCount% (
if %index% EQU 0 (
SET SOURCE_ROOT=%%~p
) ELSE (
SET SOURCE_ROOT=%SOURCE_ROOT%\%%~p
)
) ELSE (
SET PROJECT_NAME=%%~p
)
SET MYPATHCOPY=%%~q\
)
if "%MYPATHCOPY%"=="\" goto done1
goto search1
:done1
echo %SOURCE_ROOT%
echo %PROJECT_NAME%

pause


最後可以整合成以下的精簡的程式碼
main.bat
@ECHO OFF

REM ===========================================================================
REM ==== GET THE SOURCE_ROOT, PROJECT_NAME AND BUILD_TIP ======================
SET MYPATHCOPY=%CD%
SET TEMP_SOURCE_ROOT=.\
SET TEMP_PROJECT_NAME=.\
SET TEMP_BUILD_TIP1=.\
SET TEMP_BUILD_TIP2=.\
SET TEMP_BUILD_TIP3=.\
:SEARCH
FOR /F "delims=\ tokens=1,*" %%p IN ("%MYPATHCOPY%") DO (
SET TEMP_BUILD_TIP1=%TEMP_BUILD_TIP2%
SET TEMP_BUILD_TIP2=%TEMP_BUILD_TIP3%
SET TEMP_BUILD_TIP3=%%~p
IF "%TEMP_BUILD_TIP1%" NEQ ".\" (
IF "%TEMP_PROJECT_NAME%"==".\" (
SET TEMP_PROJECT_NAME=%TEMP_BUILD_TIP1%
) ELSE (
IF "%TEMP_SOURCE_ROOT%"==".\" (
SET TEMP_SOURCE_ROOT=%TEMP_PROJECT_NAME%
) ELSE (
SET TEMP_SOURCE_ROOT=%TEMP_SOURCE_ROOT%\%TEMP_PROJECT_NAME%
)
SET TEMP_PROJECT_NAME=%TEMP_BUILD_TIP1%
)
)
SET MYPATHCOPY=%%~q\
)
IF "%MYPATHCOPY%"=="\" GOTO DONE
GOTO SEARCH
:DONE
ECHO %TEMP_SOURCE_ROOT%
ECHO %TEMP_PROJECT_NAME%
ECHO %TEMP_BUILD_TIP1%
ECHO %TEMP_BUILD_TIP2%
ECHO %TEMP_BUILD_TIP3%
PAUSE


[2011.12.15 補充]
在BAT可以透過IF DEFINED判斷某一個環境變數是否有被定義
IF NOT DEFINED VALUE echo VALUE does not define

參考資料:
How to check if directory exists in %PATH%?
如何檢查是否存在%的目錄路徑%?
如何在batch文件中取得該文件的路徑

沒有留言: