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
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 de fazer isso?
Eu não sou muito exigente quanto ao método, ou desempenho, desde que seja integrado a um sistema Windows (Vista / 2008) típico.
Se você achar que o idioma do lote não é poderoso o suficiente para fazer o que você quer - e provavelmente não levará muito tempo para chegar a esse ponto - você pode usar o Windows PowerShell . Isso não é instalado por padrão em todas as versões do Windows, mas você pode baixá-lo gratuitamente.
Se você não gosta da linguagem do PowerShell, há o Perl. Você terá que instalar isso em todos os sistemas embora. Existem outros também.
Se você quiser apenas tudo após o sublinhado (e não necessariamente conhecer o comprimento da string ou onde o sublinhado é, mas pode confiar em que haja 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 um delimitador (delims = _). Apenas o segundo (tokens = 2) será passado (como variável %% a) para o loop for. O loop só será executado uma vez desde que você esteja lidando com uma única string nesse caso.
Se você quiser salvar as coisas 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 do primeiro token da divisão; %% b é a variável do segundo token da divisão.