2016-12-23 134 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

相關問題