在批处理脚本中删除文件路径

时间:2014-11-05 06:19:42

标签: file batch-file path strip

SourceFilePath = “d:\项目\代码\网站\ Beanch \ GV \ dllfunction \ dll_feature \ filename.cpp” 如何删除文件名之前的文件夹名称

从上面的示例字符串中,我想将dll_feature,dllfunction,GV转换为不同的变量。

3 个答案:

答案 0 :(得分: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

如果起始名称中没有奇怪的字符......

答案 1 :(得分: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

答案 2 :(得分: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%