如何在批处理文件中列出当前目录的所有父目录

时间:2016-12-23 21:46:24

标签: windows batch-file cmd

我想列出当前目录的所有父目录。

例如:

C:\a\b\c\d\e>list-all-parent-directories.bat
C:\a\b\c\d
C:\a\b\c
C:\a
C:

4 个答案:

答案 0 :(得分: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 ..已被执行。两个变量只匹配根文件夹。如果它们不匹配,则当前活动目录将回显到控制台。

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

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

答案 2 :(得分:0)

@Echo off
Call :DirUp "%CD%"&Goto :Eof
:DirUp
Set "ThisDir=%~dp1"&Echo:%~dp1
if Not ":\" Equ "%ThisDir:~-2%" Call :DirUp "%~dp1."

不终止反斜杠

@Echo off

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

答案 3 :(得分: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!
)