Loop over folder string and parse out last folder name

后端 未结 13 1402
-上瘾入骨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:00

    After struggling with some of these suggestions, I found an successfully used the following 1 liner (in windows 2008)

    for %%a in (!FullPath!) do set LastFolder=%%~nxa
    
    0 讨论(0)
  • 2020-12-03 06:03

    Slight alteration for if any of the folders have spaces in their names - replace space to ':' before and after operation:

    set mydir="%~p0"
    set mydir=%mydir:\=;%
    set mydir=%mydir: =:%
    
    for /F "tokens=* delims=;" %%i IN (%mydir%) DO call :LAST_FOLDER %%i
    goto :EOF
    
    :LAST_FOLDER
    if "%1"=="" (
      set LAST=%LAST::= %
      goto :EOF
    )
    
    set LAST=%1
    SHIFT
    
    goto :LAST_FOLDER
    
    0 讨论(0)
  • 2020-12-03 06:04

    Unfortunatelly, this is working great only when put on some depth but have problems with being on the very top of the mountain... Putting this program into "C:\Windows" e.g. will result with... "C:\Windows", not expected "Windows". Still great job, and still damage can be repaired. My approach:

    @echo off
    set pathtofind=%~dp0
    if not exist %pathtofind% echo Path does not exist&pause>nul&goto :eof
    
    cd /d %pathtofind%
    set path1=%cd%
    cd ..
    set path2=%cd%
    set path4=%~dp1
    call set "path3=%%path1:%path2%\=%%"
    call set "path5=%%path3:%path4%*\=%%"
    echo %path5%
    
    pause>nul
    

    And it's working just fine for me now, thanks for the idea, I was looking for something like that for some time.

    0 讨论(0)
  • 2020-12-03 06:05

    I found this old thread when I was looking to find the last segment of the current directory. The previous writers answers lead me to the following:

    FOR /D %%I IN ("%CD%") DO SET _LAST_SEGMENT_=%%~nxI
    ECHO Last segment = "%_LAST_SEGMENT_%"
    

    As previous have explained, don't forget to put quotes around any paths create with %_LAST_SEGMENT_% (just as I did with %CD% in my example).

    Hope this helps someone...

    0 讨论(0)
  • 2020-12-03 06:10

    Sheesh guys, what a mess. This is pretty easy, and it's faster to do this in memory without CD.

    This gets the last two directories of a path. Modify it as required to get the last tokens of any line. My original code I based this on has more complexity for my own purposes.

    Fyi, this probably doesn't allow paths with exclamation marks since I'm using enabledelayedexpansion, but that could be fixed.

    It also won't work on a plain drive root. This could be averted in a number of ways. Check what the input path ends with, or a counter, or modifying the token and check behaviour, etc.

    @echo off&setlocal enableextensions,enabledelayedexpansion
    
    call :l_truncpath "C:\Windows\temp"
    
    ----------
    
    :l_truncpath
    set "_pathtail=%~1"
    :l_truncpathloop
    for /f "delims=\ tokens=1*" %%x in ("!_pathtail!") do (
    if "%%y"=="" (
    set "_result=!_path!\!_pathtail!"
    echo:!_result!
    exit/b
    )
    set "_path=%%x"
    set "_pathtail=%%y"
    )
    goto l_truncpathloop
    
    0 讨论(0)
  • 2020-12-03 06:12

    3 lines of script gets the result...

    Found 2 additional ways to accomplish the goal, and unlike the other answers to this question, it requires no batch "functions", no delayed expansion, and also does not have the limitation that Tim Peel's answer has with directory deepness :

    @echo off
    SET CDIR=%~p0
    SET CDIR=%CDIR:~1,-1%
    SET CDIR=%CDIR:\=,%
    SET CDIR=%CDIR: =#%
    FOR %%a IN (%CDIR%) DO SET "CNAME=%%a"
    ECHO Current directory path: %CDIR%
    SET CNAME=%CNAME:#= %
    ECHO Current directory name: %CNAME%
    pause
    

    REVISION: after my new revsion, here is an example output:

    Current directory path: Documents#and#Settings,username,.sqldeveloper,tmp,my_folder,MY.again
    Current directory name: MY.again
    Press any key to continue . . .
    

    This means that the script doesn't handle '#' or ',' in a folder name but can be adjusted to do so.

    ADDENDUM: After asking someone in the dostips forum, found an even easier way to do it:

    @echo off
    SET "CDIR=%~dp0"
    :: for loop requires removing trailing backslash from %~dp0 output
    SET "CDIR=%CDIR:~0,-1%"
    FOR %%i IN ("%CDIR%") DO SET "PARENTFOLDERNAME=%%~nxi"
    ECHO Parent folder: %PARENTFOLDERNAME%
    ECHO Full path: %~dp0
    pause>nul
    
    0 讨论(0)
提交回复
热议问题