我想列出当前目录的所有父目录。
例如:
C:\a\b\c\d\e>list-all-parent-directories.bat
C:\a\b\c\d
C:\a\b\c
C:\a
C:
答案 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!
)