2016-12-23 131 views

回答

3

你可以尝试一种递归方法

@echo off 
    setlocal enableextensions disabledelayedexpansion 
:echoParent 
    for %%a in ("%~f1.") do if not "%%~fa"=="%%~dpa" (
     for %%b in ("%%~dpa.") do echo %%~fb 
     call :echoParent "%%~dpa" 
    ) 

它只是将调用自身的每个父文件夹,直到当前文件夹的完整路径的驱动器相匹配,并路径(根目前的文件夹和父文件夹是相同的文件夹)

或者你可以尝试与经典cd/echo方法

@echo off 
    setlocal enableextensions enabledelayedexpansion 
:echoParent 
    cd .. & if not "!cd!"=="%cd%" (echo !cd! & goto :echoParent) 

在这种情况下,“特技”是该%cd%变量在分析时解决,cd ..已经执行过,但!cd!在执行时被解决,cd ..已经执行之后。这两个变量只会在根文件夹中匹配。如果它们不匹配,则将当前活动目录回传给控制台。

当批处理文件结束并且setlocal被还原时,所有cd ..更改都将被丢弃,并保留原始活动目录。

3

下一个脚本工作:

@ECHO OFF 
SETLOCAL EnableExtensions DisableDelayedExpansion 
call :showParent "%CD%" 
ENDLOCAL 
goto :eof 

:showParent 
    set "_Parent=%~dp1" 
    echo(%_Parent:~0,-1% 
    if NOT "%~dp1"=="%~d1\" call :showParent "%_Parent:~0,-1%" 
goto :eof 

输出示例:

D:\bat\Users\Sev\AppData\Local\Temp\_MEI50722> D:\bat\SO\41308193.bat 
D:\bat\Users\Sev\AppData\Local\Temp 
D:\bat\Users\Sev\AppData\Local 
D:\bat\Users\Sev\AppData 
D:\bat\Users\Sev 
D:\bat\Users 
D:\bat 
D: 

D:\bat\Users\Sev\AppData\Local\Temp\_MEI50722> 
0
@Echo off 
Call :DirUp "%CD%"&Goto :Eof 
:DirUp 
Set "ThisDir=%~dp1"&Echo:%~dp1 
if Not ":\" Equ "%ThisDir:~-2%" Call :DirUp "%~dp1." 

没有终止反斜杠

关闭@echo

Call :DirUp "%CD%"&Goto :Eof 
:DirUp 
Set "ThisDir=%~dp1" 
Echo:%ThisDir:~0,-1% 
if Not ":\" Equ "%ThisDir:~-2%" Call :DirUp "%ThisDir:~0,-1%" 
0

恕我直言非递归方法更为简单:

@echo off 
setlocal EnableDelayedExpansion 

set "this=" & set "next=" 
for %%a in ("%cd:\=" "%") do (
    set "this=!this!\!next!" 
    set "next=%%~a" 
    if "!this:~2!" neq "" echo !this:~2! 
) 
+0

有趣的方法,但如果当前目录路径包含任何'!'字符,则失败。 – dbenham

相关问题