Как извлечь часть строки в пакетный файл Windows?

30

Предположим, у меня есть значение, например «Abc_123», которое хранится в переменной в пакетном (cmd) файле. Я хочу в конечном итоге с переменной, которая содержит только «123». Есть ли встроенный способ сделать это?

Я не очень требователен к методу или производительности, если он встроен в типичную систему Windows (Vista / 2008).

кругозор
источник

Ответы:

40

Используйте синтаксис подстроки:

C:\Users\John>set string=Abc_123

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

C:\Users\John>echo %string:~4,3%
123
Джон Т
источник
4
Вы можете увидеть полный синтаксис, help setкак указано в разделе Как лучше всего сделать подстроку в командном файле? на StackOverflow.
User5910 25.10.16
1
Если бы мне нужно, чтобы 4 и 3 были переменными входами, как бы я это сделал? %string:~%start%,%len%%
МакПо
ничего. Я нашел ответ. ss64.com/nt/syntax-substring.html
МакПо
3
Чтобы подвести итог по ссылке из @MakPo: используйте CALL, какCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny
8

Если вы просто хотите все после подчеркивания (и не обязательно знаете длину строки или где находится подчеркивание, но можете полагаться только на одно подчеркивание), попробуйте:

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

По сути, ваша строка будет разбита на токены с использованием подчеркивания в качестве разделителя (delims = _). Только второй (tokens = 2) будет передан (как переменная %% a) в цикл for. Цикл будет выполняться только один раз, поскольку в этом случае вы имеете дело с одной строкой.

Если вы хотите сохранить материал как до, так и после подчеркивания, попробуйте:

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

Обратите внимание, что %% a является переменной для первого токена разбиения; %% b - это переменная для второго токена разбиения.

DocOc
источник
3

Если вы обнаружите, что пакетный язык недостаточно мощный, чтобы делать то, что вы хотите - и, скорее всего, вам не понадобится слишком много времени, чтобы достичь этого - вы можете использовать Windows PowerShell . Он не установлен по умолчанию во всех версиях Windows, но вы можете скачать его бесплатно.

Если вам не нравится язык PowerShell, есть Perl. Вы должны будете установить это на всех системах, хотя. Есть и другие тоже.

Уэйн Джонстон
источник
Вопрос не о Powershell или Perl
Зимба
2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%
Zimba
источник
3
Что это делает конкретно?
Сок Pimp IT
О, если бы вы спросили, как работает этот код: он удаляет все до числа, перед которым стоит знак подчеркивания.
Зимба
@ Зимба, есть ли способ просто расширить это до "последнего _"? Также, где я могу найти это в любой документации?
TWiStErRob
Хорошо, нашел документы, добавил, чтобы ответить. Вопрос все еще стоит: как я могу сделать *жадным? Я использовал хороший старый IF NOT ... GOTO :replace, но было бы хорошо, если бы был лучший способ.
TWiStErRob
1
@TWiStErRob: Понятно. Если вы не знаете, сколько _их, перейдите к последнему, а затемset var
Зимба