Единственное ограничение, решение MC ND заключается в том, что вы должны знать глубину каталога, чтобы получить детали в конце.
Вот альтернативная стратегия, в которой используются рекурсия и подпрограммы. «Подпрограмма» :SPLIT
получает значение n th элемент из указанного пути (0 - самый правый) и сохраняет его в указанной переменной. Способ, которым он написан, если вы укажете уровень, который больше числа частей каталога, он сохраняет пустую строку переменной. Это может быть легко изменено, если это было бы желательно.
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "SourceFilePath=D:\Projects\Code\Site\Beanch\GV\dllfunction\dll_feature\filename.cpp"
FOR /L %%i IN (0,1,10) DO (
CALL :SPLIT "%SourceFilePath%" %%i TGT
@ECHO [%%i] !TGT!
)
EXIT /B
REM Syntax: CALL :SPLIT _path_ _level_
REM Get the _nth_ element of the path (0 is the right-most)
:SPLIT
SETLOCAL ENABLEDELAYEDEXPANSION
SET "PATH=%~1"
SET "LEVEL=%~2"
SET "TARGET_VAR=%~3"
REM Strip off a trailing dir sep (for the %%~ substitution).
IF "%PATH:~-1,1%"=="\" SET "PATH=!PATH:~0,-1!"
FOR %%p IN (%PATH%) DO (
IF /I "%PATH%"=="%%~dp" (
REM BASE CASE
IF "%LEVEL%"=="0" (
SET "_TARGET=%PATH%"
) ELSE (
SET "_TARGET="
)
) ELSE IF "%LEVEL%"=="0" (
REM Return the leaf
SET "_TARGET=%%~nxp"
) ELSE (
REM Recurse on the drive+directory
SET /A SUBLEVEL=LEVEL-1
CALL :SPLIT "%%~dpp" !SUBLEVEL! _TARGET
)
)
ENDLOCAL && SET "%TARGET_VAR%=%_TARGET%"
EXIT /B
Вывод этого сценария:
[0] filename.cpp
[1] dll_feature
[2] dllfunction
[3] GV
[4] Beanch
[5] Site
[6] Code
[7] Projects
[8] D:
[9]
[10]
Для описания вы даете, это вызов даст вам что-то, как вы хотите:
CALL :SPLIT "%SourceFilePath%" 0 PART0
@ECHO %PART0%
CALL :SPLIT "%SourceFilePath%" 1 PART1
@ECHO %PART1%
CALL :SPLIT "%SourceFilePath%" 2 PART2
@ECHO %PART2%
+1: Предоставление счета. – mojo