Lista de diretórios e subdiretórios

1

Estou tentando listar o nome do diretório (somente nome, não caminho completo) e sub-diretórios (somente nome, não caminho completo) dentro dele. Existe apenas um nível de subdiretórios. Eu usei o script abaixo para fazer isso:

@echo off&setlocal enableextensions

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

O problema com o script acima é que ele está mostrando o diretório raiz com o caminho completo. Como posso mostrar os diretórios em relação àquele em que estou trabalhando?

    
por shekhar 11.12.2012 / 08:30

2 respostas

1

Aceitando que você deseja apenas um nível de pastas filhas:

@echo off
for %%A in ("yourRootPath\*") do for /d %%B in ("%%~A\*") do echo %%~nxA\%%~nxB

Se o caminho da sua raiz for passado como um parâmetro em lote, a solução será ainda mais fácil

@echo off
for /d %%B in ("%~1\*") do echo %~nx1\%%~nxB
    
por 11.12.2012 / 13:26
1

Você pode usar:

for %f in ("C:\Some\Path\Like\This") do echo "%~nf"

para exibir apenas:

"This"

Se é a raiz assim:

for %f in ("C:\") do echo "%~nf"

ele exibirá nada como:

""

Mas você disse:

problem with the above script is it showing root directory wit full path.

Você quer dizer, por exemplo, quando executado na raiz da unidade será exibido:

C:\
  or
\

O que é realmente exibido e o que você deseja exibir no caso da raiz? Eu acho que deveria ser nada (vazio), mas isso pode não ser o que você quer.

Deixe-me saber o que você deseja para este caso e veremos se posso consertar seu arquivo de lote.

Editar:

Acho que o que você quer dizer com "root" é o diretório a partir do qual você está iniciando sua pesquisa. Eu pensei que você quis dizer que você estava executando o arquivo de lote na raiz da unidade como "C: \".

Este arquivo em lote deve fazer o que você quiser ...

Se você salvá-lo em um arquivo chamado:

getdirname.cmd

Então você pode executá-lo assim:

getdirname.cmd "C:\Some\PATH"
getdirname.cmd C:\Some\PATH

se você executá-lo sem argumentos como este:

getdirname.cmd

usará o diretório atual como ponto de partida.

Aqui está o arquivo em lote:

@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

Eu tenho uma estrutura de diretórios como:

C:\Some\PATH
C:\Some\PATH\aaa
C:\Some\PATH\bbb
C:\Some\PATH\ccc

Se eu estiver conectado (CD) ao caminho:

C:\Some

e eu corro getdirname como qualquer um dos seguintes:

getdirname C:\Some\PATH
getdirname C:.\Path
getdirname C:Path
getdirname .\Path
getdirname Path

a saída será parecida com:

"PATH"
"aaa"
"bbb"
"ccc"

Se eu executar o getdirname como:

getdirname C:
getdirname .
getdirname .\

a saída será parecida com:

"Some"
"PATH"
"aaa"
"bbb"
"ccc"

Se eu executar o getdirname como:

getdirname \
getdirname C:\

e execute o arquivo em lote, a saída será semelhante a:

""
"Some"
"PATH"
"aaa"
"bbb"
"ccc"

Deixe-me saber se isso está fazendo o que você precisa ou se precisa de "ajustes".

    
por 11.12.2012 / 08:59