Come estrarre parte di una stringa nel file batch di Windows?


29

Supponiamo che io abbia un valore come "Abc_123" che è memorizzato in una variabile in un file batch (cmd). Voglio finire con una variabile che contiene solo "123". C'è un modo integrato per farlo?

Non sono terribilmente esigente riguardo al metodo o alle prestazioni, purché sia ​​integrato in un tipico sistema Windows (Vista / 2008).

Risposte:


40

Usa la sintassi della sottostringa:

C:\Users\John>set string=Abc_123

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

C:\Users\John>echo %string:~4,3%
123

4
È possibile visualizzare la sintassi completa con help setcome indicato in Qual è il modo migliore per eseguire una sottostringa in un file batch? su StackOverflow.
Utente 5910

1
Se avessi bisogno che 4 e 3 fossero input variabili, come avrei fatto? %string:~%start%,%len%%
MakPo,

non importa. Ho trovato la risposta ss64.com/nt/syntax-substring.html
MakPo

3
Per riassumere il link da @MakPo: usa CALL, comeCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny,

8

Se vuoi solo tutto dopo il carattere di sottolineatura (e non conosci necessariamente la lunghezza della stringa o dove si trova il carattere di sottolineatura, ma puoi fare affidamento sul fatto che esiste solo un carattere di sottolineatura), prova:

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

Fondamentalmente, la tua stringa verrà divisa in token usando il trattino basso come delimitatore (delims = _). Solo il secondo (token = 2) verrà passato (come variabile %% a) al ciclo for. Il ciclo verrà eseguito una sola volta poiché in questo caso hai a che fare con una singola stringa.

Se vuoi salvare le cose sia prima che dopo il trattino basso, prova:

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

Si noti che %% a è la variabile per il primo token della divisione; %% b è la variabile per il secondo token della divisione.


3

Se scopri che la lingua batch non è abbastanza potente per fare quello che vuoi - e probabilmente non ci vorrà troppo tempo per arrivare a quel punto - puoi usare Windows PowerShell . Questo non è installato di default su tutte le versioni di Windows, ma puoi scaricarlo gratuitamente.

Se non ti piace il linguaggio PowerShell, c'è Perl. Dovrai installarlo su tutti i sistemi però. Ce ne sono anche altri.


La domanda non si pone su Powershell o Perl
Zimba,

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

3
Cosa fa questo in modo specifico?
Pimp Juice IT

Oh, se ti chiedessi come funziona questo codice: rimuove tutto prima del numero, preceduto da un trattino basso.
Zimba,

@Zimba c'è un modo per estenderlo semplicemente a "last _"? Inoltre dove posso trovarlo in qualsiasi documentazione?
TWiStErRob

Ok, ho trovato un documento, aggiunto per rispondere. Le domande sono ancora valide: come posso rendere *goloso? Ho usato un buon vecchio IF NOT ... GOTO :replace, ma sarebbe bello se ci fosse un modo migliore.
TWiStErRob

1
@TWiStErRob: capisco. Se non sai quanti _ce ne sono, passa all'ultimo, quindiset var
Zimba
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.