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).

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

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.


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.


Pytanie nie dotyczy Powershell ani Perla
Zimba

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.