我想列出当前目录的所有父目录。如何列出批处理文件中当前目录的所有父目录
例如:
C:\a\b\c\d\e>list-all-parent-directories.bat
C:\a\b\c\d
C:\a\b\c
C:\a
C:
我想列出当前目录的所有父目录。如何列出批处理文件中当前目录的所有父目录
例如:
C:\a\b\c\d\e>list-all-parent-directories.bat
C:\a\b\c\d
C:\a\b\c
C:\a
C:
你可以尝试一种递归方法
@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 ..
更改都将被丢弃,并保留原始活动目录。
下一个脚本工作:
@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>
@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%"
恕我直言非递归方法更为简单:
@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!
)
有趣的方法,但如果当前目录路径包含任何'!'字符,则失败。 – dbenham
最后一个应读为C:\'... – aschipfl
我想你忘了'C:\ A \ B'目录? –