Lista de diretórios e subdiretórios


1

Estou tentando listar o nome do diretório (somente nome, caminho não completo) e subdiretórios (somente nome, caminho não completo) dentro dele. Há 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 apenas mostrar os diretórios em relação àqueles em que estou trabalhando?

Respostas:


1

Confiando na sua palavra de que você deseja apenas um nível de pastas filho:

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

Se seu caminho 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

Agora estou tentando renomear arquivos dentro de subpastas usando --- para %% A em ("Mypath") faça para / d %% B em ("%% ~ A *") faça (cd %% ~ nxA \ %% ~ nxB FOR %% v IN (A20 *. *) REN "%% v" "%% ~ nxB _ %% v") ---. Mas é possível renomear arquivos em apenas uma subpasta. Como posso fazer isso em cada subpasta.
Shekhar

1

Você pode usar:

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

para exibir apenas:

"This"

Se for a raiz assim:

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

não exibirá nada como:

""

Mas você disse:

O problema com o script acima está mostrando o diretório raiz com o caminho completo.

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

C:\
  or
\

O que realmente está sendo exibido e o que você deseja exibir no caso da raiz? Eu acho que não deve ser nada (vazio), mas pode não ser o que você deseja.

Deixe-me saber o que você deseja para este caso e vou ver se consigo consertar seu arquivo em lotes.

Editar:

Eu acho que o que você quer dizer com "raiz" é o diretório em que você está iniciando sua pesquisa. Eu pensei que você queria dizer que você estava executando o arquivo em lotes na raiz do drive como "C: \".

Esse arquivo em lotes deve fazer o que você deseja ...

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

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

Aqui está o arquivo em lotes:

@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 logado (CD), o caminho:

C:\Some

e eu corro o getdirname como qualquer um de:

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

a saída será semelhante a:

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

Se eu executar o getdirname como:

getdirname C:
getdirname .
getdirname .\

a saída será semelhante a:

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

Se eu executar o getdirname como:

getdirname \
getdirname C:\

e execute o arquivo em lotes, 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".


Para exibir o diretório atualmente em funcionamento, podemos usar para %% * em (.) Definir MyDir = %% ~ n *. Mas também quero listar subdiretórios. É por isso que estou acessando recursivamente os subdiretórios usando for / r.
shekhar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.