我试图列出目录名称(仅名称,不是完整路径)和其中的子目录(仅名称,不是完整路径)。子目录只有一层。我使用以下脚本来执行此操作:
@echo off&setlocal enableextensions
for /r "PATH" %%G in (.) do (
Pushd %%G
for %%* in (.) do set MyDir=%%~n*
echo %MyDir%
popd
)
endlocal&goto :eof
上述脚本的问题在于它显示了带有完整路径的根目录。我怎样才能让它只显示与我正在工作的目录相关的目录?
答案1
相信您只想要一个级别的子文件夹:
@echo off
for %%A in ("yourRootPath\*") do for /d %%B in ("%%~A\*") do echo %%~nxA\%%~nxB
如果您的根路径作为批处理参数传递,那么解决方案就更简单了
@echo off
for /d %%B in ("%~1\*") do echo %~nx1\%%~nxB
答案2
您可以使用:
for %f in ("C:\Some\Path\Like\This") do echo "%~nf"
仅显示:
"This"
如果它是这样的根:
for %f in ("C:\") do echo "%~nf"
它将显示没有什么喜欢:
""
但你说:
上述脚本的问题是它显示了带有完整路径的根目录。
您的意思是,例如,当在驱动器的根目录下运行时它会显示:
C:\
or
\
它实际上显示什么,如果是根目录,您想显示什么?我猜应该是没有什么(空),但这可能不是您想要的。
请告诉我您对这个案例的要求,我会看看是否可以修复您的批处理文件。
编辑:
我猜你所说的“根”是指你开始搜索的目录。我以为你的意思是在驱动器根目录(如“C:\”)中运行批处理文件。
这个批处理文件应该可以执行您想要的操作...
如果将其保存到名为的文件:
getdirname.cmd
然后你可以像这样运行它:
getdirname.cmd "C:\Some\PATH"
getdirname.cmd C:\Some\PATH
如果你在没有任何参数的情况下运行它,如下所示:
getdirname.cmd
它将使用当前目录作为起点。
这是批处理文件:
@echo off
set "zstartpath=%~1"
if "%zstartpath%."=="." set "zstartpath=."
for %%f in ("%zstartpath%") do set "zfullpath=%%~dpnxf\"
for /r "%zfullpath%" %%f in (.) do call :work "%%~f"
set "zdfname="
set "zdp="
set "zdpath="
set "zfullpath="
set "zstartpath="
set "ztarget="
goto :EOF
:work
set "ztarget=%~1"
for %%g in ("%ztarget%") do set "zdpath=%%~dpnxg"
for %%g in ("%zdpath%") do set "zdfname=%%~nxg"
echo "%zdfname%"
goto :EOF
我有一个如下的目录结构:
C:\Some\PATH
C:\Some\PATH\aaa
C:\Some\PATH\bbb
C:\Some\PATH\ccc
如果我登录到(CD),路径:
C:\Some
然后我像以下任何一种方法一样运行 getdirname:
getdirname C:\Some\PATH
getdirname C:.\Path
getdirname C:Path
getdirname .\Path
getdirname Path
输出结果如下:
"PATH"
"aaa"
"bbb"
"ccc"
如果我像这样运行 getdirname:
getdirname C:
getdirname .
getdirname .\
输出结果如下:
"Some"
"PATH"
"aaa"
"bbb"
"ccc"
如果我像这样运行 getdirname:
getdirname \
getdirname C:\
并运行批处理文件,输出将如下所示:
""
"Some"
"PATH"
"aaa"
"bbb"
"ccc"
请告诉我这是否满足您的需要,或者是否需要进行任何“调整”。