Jak wyodrębnić część ciągu z pliku wsadowego systemu Windows?

30

Załóżmy, że mam wartość, taką jak „Abc_123”, która jest przechowywana w zmiennej w pliku wsadowym (cmd). Chcę skończyć ze zmienną, która zawiera tylko „123”. Czy jest jakiś wbudowany sposób to zrobić?

Nie jestem wybredna co do metody lub wydajności, o ile jest ona wbudowana w typowy system Windows (Vista / 2008).

Rozpoznać
źródło

Odpowiedzi:

40

Użyj składni podłańcucha:

C:\Users\John>set string=Abc_123

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

C:\Users\John>echo %string:~4,3%
123
John T.
źródło
4
Możesz zobaczyć pełną składnię, help setjak wspomniano w Jaki jest najlepszy sposób na wykonanie podłańcucha w pliku wsadowym? na StackOverflow.
User5910,
1
Gdybym potrzebował, aby te 4 i 3 były zmiennymi danymi wejściowymi, jak miałbym to zrobić? %string:~%start%,%len%%
MakPo
nieważne. Znalazłem odpowiedź ss64.com/nt/syntax-substring.html
MakPo
3
Podsumowując link z @MakPo: użyj CALL, jakCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny
8

Jeśli chcesz wszystko po znaku podkreślenia (i niekoniecznie znasz długość łańcucha lub gdzie jest znak podkreślenia, ale możesz polegać na tym, że istnieje tylko jeden znak podkreślenia), spróbuj:

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

Zasadniczo łańcuch zostanie podzielony na tokeny, używając podkreślnika jako separatora (delims = _). Tylko drugi (tokeny = 2) zostanie przekazany (jako zmienna %% a) do pętli for. Pętla uruchomi się tylko raz, ponieważ w tym przypadku masz do czynienia z jednym ciągiem.

Jeśli chcesz zapisać rzeczy zarówno przed, jak i po podkreśleniu, spróbuj:

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

Zauważ, że %% a jest zmienną dla pierwszego tokena podziału; %% b jest zmienną dla drugiego tokena podziału.

DocOc
źródło
3

Jeśli okaże się, że język wsadowy nie jest wystarczająco mocny, aby zrobić to, co chcesz - i prawdopodobnie nie zajmie ci to zbyt długo, aby przejść do tego punktu - możesz użyć programu Windows PowerShell . Nie jest to domyślnie instalowane we wszystkich wersjach systemu Windows, ale można je pobrać bezpłatnie.

Jeśli nie lubisz języka PowerShell, jest Perl. Musisz jednak zainstalować to na wszystkich systemach. Są też inni.

Wayne Johnston
źródło
Pytanie nie dotyczy Powershell ani Perla
Zimba
2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%
Zimba
źródło
3
Co to konkretnie robi?
Pimp Juice IT,
Och, jeśli pytasz, jak działa ten kod: usuwa wszystko przed liczbą, poprzedzone znakiem podkreślenia.
Zimba
@Zimba jest sposób, aby po prostu przedłużyć to do „ostatniego _”? Gdzie mogę to znaleźć w dokumentacji?
TWiStErRob
Ok, znalazłem dokumenty, dodano odpowiedź. Nadal stoją pytania: jak mam być *chciwy? Użyłem dobrego IF NOT ... GOTO :replace, ale byłoby miło, gdyby istniał lepszy sposób.
TWiStErRob
1
@TWiStErRob: Rozumiem. Jeśli nie wiesz, ile _ich jest, przejdź do ostatniego, a następnieset var
Zimba