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".