1

Я пытаюсь перечислить имя каталога (только имя, а не полный путь) и подкаталоги (только имя, а не полный путь) внутри него. Существует только один уровень подкаталогов. Я использовал скрипт ниже, чтобы сделать это:

@echo off&setlocal enableextensions

for /r  "PATH" %%G in (.) do (
Pushd %%G
for %%* in (.) do set MyDir=%%~n*
echo %MyDir% 
popd
)
endlocal&goto :eof

Проблема с приведенным выше сценарием заключается в том, что он показывает корневой каталог с полным путем. Как сделать так, чтобы каталоги отображались по отношению к тому, в котором я работаю?

2 ответа2

1

Ты можешь использовать:

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"

Дайте мне знать, если вы делаете то, что вам нужно, или нужны какие-то "корректировки".

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .