Loop over folder string and parse out last folder name

后端 未结 13 1452
-上瘾入骨i
-上瘾入骨i 2020-12-03 05:39

I need to grab the folder name of a currently executing batch file. I have been trying to loop over the current directory using the following syntax (which is wrong at prese

13条回答
  •  伪装坚强ぢ
    2020-12-03 06:19

    I don't know if it's the version of windows I'm on (win2k3), but the FOR loop isn't giving me anything useful for trying to iterate through a single string. According to my observation (and the FOR /? info) you get one iteration for each line of input to FOR, and there is no way to change this to iterate within a line. You can break into multiple tokens for a given line, but it is only one invocation of the FOR loop body.

    I do think the CALL :LABEL approach in these answers does a great job. Something I didn't know until looking at this was that ";" and "," are both recognized as argument separators. So once you replace backslashes with semicolons, you can call your label and iterate through with SHIFT.

    So working off of what is posted by others here, I have the below solution. Instead of grabbing the last folder name, I actually wanted to find everything up until some known directory name.. this is what is implemented below.

    @echo off
    if "%1"=="" goto :USAGE
    
    set FULLPATH=%~f1
    set STOPDIR=%2
    set PATHROOT=
    
    :: Replace backslashes with semicolons
    set FULLPATH=%FULLPATH:\=;%
    
    :: Iterate through path (the semicolons cause each dir name to be a new argument)
    call :LOOP %FULLPATH%
    goto :EOF
    
    :LOOP
    
    ::Exit loop if reached the end of the path, or the stop dir
    if "%1"=="" (goto :EOF)
    if "%1"=="%STOPDIR%" (goto :EOF)
    
    ::If this is the first segment of the path, set value directly. Else append.
    if not defined PATHROOT (set PATHROOT=%1) else (set PATHROOT=%PATHROOT%\%1)
    
    ::shift the arguments - the next path segment becomes %i
    SHIFT
    
    goto :LOOP
    
    :USAGE
    echo Usage:
    echo %~0 ^ ^
    echo E.g. for a command:
    echo %~0 c:\root1\child1\child2 child2
    echo The value of c:\root1\child1 would be assigned to env variable PATHROOT
    

提交回复
热议问题