Em primeiro lugar, não use path
como um nome de variável.
Prompt de Comando do Windows
(diferentemente da maioria dos componentes do Unix, incluindo os shells)
trata nomes de variáveis de uma maneira que não diferencia maiúsculas de minúsculas,
então path
é o mesmo que PATH
, que é o seu caminho de busca de execução,
e se você atribuir algo aleatório a isso, você estará em um mundo de mágoa.
Use o formulário %variable:str1=str2%
.
(Eu presumo que você saiba que set /?
documenta esses formulários.)
Este é um substituto:
C:\> set play=food
C:\> echo %play:foo=bar%
bard
C:\> set animal=cat
C:\> echo %animal:at=ow%
cow
Isso suporta um recurso de correspondência de padrões muito limitado ;
%variable:*str1=str2%
encontrará e excluirá
tudo até e incluindo a primeira ocorrência de str1
e substituí-lo por str2
.
Em particular, %variable:*\=%
substituirá
tudo até e incluindo o primeiro \
com null.
Por exemplo, se %pathname%
for C:\Windows\Example
,
então %pathname:*\=%
1 ExampleWindows\Example
5 ExampleC:\
1 Examplefor
5 Example%%I
avaliará para
%pathname%
(sem o %%~I
).
Se o seu nome de caminho sempre tiver quatro níveis, você pode fazer
for %%I in (%pathname%) do set tempname=%%~I
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set basename=%tempname%
echo %basename%
A declaração tempname
é um pouco de um kludge.
É um loop garantido para executar exatamente uma vez
com a variável de índice %%~I
definida para o valor de %%I
1 .
Em seguida, ele atribui %pathname%
a "
.
%pathname%
é o valor de set tempname=%pathname%
(ou seja, o valor de \
)
exceto se essa sequência começar e terminar com caracteres de citação ( %pathname%
),
eles são removidos.
Se você tem certeza de que ?
não começa e termina com aspas
(por exemplo, porque você já fez isso ou algo equivalente),
você pode pular este passo e começar dizendo *
.
Se o nome do caminho tiver um número indeterminado de níveis, faça
for %%I in (%pathname%) do set tempname1=%%~I
:loop
set tempname2=%tempname1:*\=%
if not %tempname1% == %tempname2% ( set tempname1=%tempname2% & goto loop )
set basename=%tempname1%
echo %basename%
que faz loops até que não restem %variable:str1=str2%
s.