Як витягти частину рядка в пакетному файлі 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

1
Якщо мені знадобилося, щоб 4 і 3 були змінними входами, як би це зробити? %string:~%start%,%len%%
MakPo

не звертай уваги. Я знайшов відповідь. ss64.com/nt/syntax-substring.html
MakPo

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 = _). Лише другий (лексеми = 2) буде переданий (як змінна %% a) до циклу for. Цикл запускається лише один раз, оскільки в цьому випадку ви маєте справу з одним рядком.

Якщо ви хочете зберегти матеріал як до, так і після підкреслення, спробуйте:

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

Зауважимо, що %% a - змінна для першого маркера розбиття; %% b - змінна для другого маркера розбиття.


3

Якщо ви виявите, що пакетна мова недостатньо потужна, щоб робити те, що вам завгодно - і, ймовірно, не знадобиться занадто багато часу, щоб дійти до цього пункту - ви можете використовувати Windows PowerShell . Це не встановлено за замовчуванням у всіх версіях Windows, але ви можете завантажити його безкоштовно.

Якщо вам не подобається мова PowerShell, є Perl. Це вам доведеться встановити на всіх системах. Є й інші.


Питання не в питанні про Powershell або Perl
Zimba

2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%

3
Що це робить конкретно?
Pimp Juice IT

О, якби ви запитували, як працює цей код: він видаляє все перед числом, перед яким підкреслюється.
Зімба

@Zimba Є спосіб просто поширити це на "останнє _"? Також де я можу це знайти в будь-якій документації?
TWiStErRob

Добре, знайшли документи, додані для відповіді. Питання все ще стоїть: як мені зробити *жадібним? Я використовував добрий ol ' IF NOT ... GOTO :replace, але було б добре, якби був кращий спосіб.
TWiStErRob

1
@TWiStErRob: Я бачу. Якщо ви не знаєте, скільки _їх є, перейдіть до останнього, тодіset var
Зімба
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.