2014-11-05 2 views

ответ

1
@ECHO Off 
SETLOCAL 
SET "SourceFilePath=D:\Projects\Code\Site\Beanch\GV\dllfunction\dll_feature\filename.cpp" 
SET /a count=0 
:loop 
FOR %%a IN ("%sourcefilepath%") DO SET "part%count%=%%~nxa"&SET "sourcefilepath=%%~dpa" 
IF DEFINED part%count% SET /a count +=1&SET "sourcefilepath=%sourcefilepath:~,-1%"&GOTO loop 
SET part 
SET count 
GOTO :EOF 

условии, что вы don'y имеют извращенец символы в исходном имени ...

+0

+1: Предоставление счета. – mojo

1
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "sourceFilePath=D:\Projects\Code\Site\Beanch\GV\dllfunction\dll_feature\filename.cpp" 

    set "count=10000" 
    for %%a in ("%sourceFilePath:\=" "%") do (
     setlocal enabledelayedexpansion 
     for %%b in (!count:~-4!) do (
      endlocal 
      set "e_%%b=%%a" 
     ) 
     set /a "count+=1" 
    ) 

    rem Show the variables 
    set e_ 

Разделяет каждый элемент в переменной, заменяющей обратной косой черты с пространством (все, что цитируемый, чтобы избежать проблем) и каждый элемент, переменная определена

Номера с именами переменных дополняются. Если не нужно просто изменить начальное значение count на 0

0

Единственное ограничение, решение 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% 
Смежные вопросы