Como extrair parte de uma string no arquivo em lotes do Windows?

29

Suponha que eu tenha um valor como "Abc_123" armazenado em uma variável em um arquivo em lotes (cmd). Eu quero acabar com uma variável que contém apenas "123". Existe alguma maneira embutida de fazer isso?

Não sou muito exigente quanto ao método ou desempenho, desde que embutido em um sistema típico do Windows (Vista / 2008).

Ken
fonte

Respostas:

40

Use a sintaxe de substring:

C:\Users\John>set string=Abc_123

C:\Users\John>echo %string%
Abc_123

C:\Users\John>echo %string:~4,3%
123
John T
fonte
4
Você pode ver a sintaxe completa help setcomo mencionado em Qual é a melhor maneira de fazer uma substring em um arquivo em lotes? no StackOverflow.
User5910
1
Se eu precisasse que 4 e 3 fossem entradas variáveis, como faria isso? %string:~%start%,%len%%
MakPo
deixa pra lá. Eu encontrei a resposta. ss64.com/nt/syntax-substring.html
MakPo
3
Para resumir o link de @MakPo: uso CALL, comoCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny
8

Se você deseja apenas tudo após o sublinhado (e não sabe necessariamente o comprimento da string ou onde está o sublinhado, mas pode confiar na existência de apenas um sublinhado), tente:

for /f "tokens=2 delims=_" %%a in ("%STRING%") do (
  set AFTER_UNDERSCORE=%%a
)

Basicamente, sua string será dividida em tokens usando o sublinhado como delimitador (delims = _). Somente o segundo (tokens = 2) será passado (como variável %% a) para o loop for. O loop será executado apenas uma vez, já que você está lidando com uma única string.

Se você deseja salvar o material antes e depois do sublinhado, tente:

for /f "tokens=1,2 delims=_" %%a in ("%STRING%") do (
  set BEFORE_UNDERSCORE=%%a
  set AFTER_UNDERSCORE=%%b
)

Observe que %% a é a variável para o primeiro token da divisão; %% b é a variável para o segundo token da divisão.

DocOc
fonte
3

Se você achar que o idioma do lote não é poderoso o suficiente para fazer o que você deseja - e provavelmente não levará muito tempo para chegar a esse ponto - você poderá usar o Windows PowerShell . Por padrão, não está instalado em todas as versões do Windows, mas você pode baixá-lo gratuitamente.

Se você não gosta da linguagem do PowerShell, existe o Perl. Você precisará instalá-lo em todos os sistemas. Existem outros também.

Wayne Johnston
fonte
A questão não está perguntando sobre o PowerShell ou Perl
Zimba
2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%
Zimba
fonte
3
O que isso faz especificamente?
Pimp Juice IT
Ah, se você estava perguntando como esse código funciona: ele remove tudo antes do número, precedido por um sublinhado.
Zimba
@Zimba, existe uma maneira de simplesmente estender isso para "last _"? Também onde posso encontrar isso em qualquer documentação?
TWiStErRob 25/01
Ok, encontrei um documento, adicionado à resposta. As perguntas ainda permanecem: como faço para *ganancioso? Eu usei um bom velho IF NOT ... GOTO :replace, mas seria bom se houvesse uma maneira melhor.
TWiStErRob 25/01
1
@TWiStErRob: Entendo. Se você não sabe quantos _existem, então passe para o último, entãoset var
Zimba 29/01