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

Windows 如何在批处理文件中列出当前目录的所有父目录,windows,batch-file,cmd,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\b C:\a C: 您可以尝试递归方法 @echo关闭 setlocal enableextensions disabledelayedexpansion :echoParent 对于(“%f1”)中的%%a,如果不是“%%~fa”==“%%~dpa”( 对于(“%%~dpa.”中的%%b,执行echo%%~fb

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

例如:

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

您可以尝试递归方法

@echo关闭
setlocal enableextensions disabledelayedexpansion
:echoParent
对于(“%f1”)中的%%a,如果不是“%%~fa”==“%%~dpa”(
对于(“%%~dpa.”中的%%b,执行echo%%~fb
调用:echoParent“%%~dpa”
)
它只会为每个父文件夹调用自己,直到当前文件夹的完整路径与其驱动器和路径匹配(在根目录上,当前文件夹和父文件夹是同一个文件夹)

或者您可以尝试使用经典的
cd/echo
方法

@echo关闭
setlocal enableextensions enabledelayedexpansion
:echoParent
cd..&如果不是“!cd!”=“%cd%”(echo!cd!&goto:echoParent)
在这种情况下,“技巧”是在执行
cd..
之前,在解析时解析
%cd%
变量,但是
!cdcd..
后,代码>在执行时解析。这两个变量将仅在根文件夹中匹配。如果它们不匹配,则当前active directory将回显到控制台

批处理文件结束时,所有
cd..
更改将被丢弃,并且
setlocal
将被还原,保留原始active directory。

下一个脚本工作:

@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>
没有终止反斜杠

@回音

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

IMHO非递归方法更简单:

@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!
)

最后一个应该是
C:\
…我想你忘记了
C:\a\b
目录?有趣的方法,但是如果当前目录路径包含任何
,它就会失败字符。
@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!
)