Batch - Excluir caracteres em uma string

1

Por exemplo, eu tenho o seguinte caminho: %código% Eu preciso extrair o "C:\Windows\Example"005 Example"1 Example"set path=%path:~0,11%"5 Example" dessa string. Eu tentei com "C:\Windows\Example%code%1 Example%code%5 Example_2" , mas o caminho também pode ser %code%

O que eu preciso é cortar a string depois do último "\"

Como posso fazer isso?

    
por NvyxMarx 21.11.2016 / 07:33

1 resposta

1

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%pathname:*\=%1 ExampleWindows\ExampleC:\1 Examplefor5 Example5 Example , então %%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.

por 21.11.2016 / 08:42