40 votes

Comment extraire une partie d'une chaîne dans un fichier de commandes Windows?

Supposons que j'ai une valeur comme "Abc_123" qui est stockée dans une variable dans un fichier batch (cmd). Je veux obtenir une variable qui contient seulement "123". Y a-t-il un moyen intégré pour le faire ?

Je ne suis pas très exigeant sur la méthode, ou les performances, tant qu'elle est intégrée à un système Windows (Vista / 2008) typique.

53voto

Dalroth Points 2468

Utilisez la syntaxe de sous-chaîne :

C:\Users\John>set string=Abc_123

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

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

13voto

DocOc Points 251

Si vous voulez simplement obtenir tout ce qui se trouve après le tiret bas (et que vous ne connaissez pas nécessairement la longueur de la chaîne ou l'endroit où se trouve le tiret bas, mais pouvez compter sur le fait qu'il n'y en a qu'un seul), essayez:

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

Fondamentalement, votre chaîne sera divisée en jetons en utilisant le tiret bas comme délimiteur (delims=_). Seul le deuxième (tokens=2) sera transmis (en tant que variable %%a) à la boucle for. La boucle ne s'exécutera qu'une seule fois car vous traitez ici avec une seule chaîne.

Si vous voulez sauvegarder à la fois ce qui se trouve avant et après le tiret bas, essayez:

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

Remarquez que %%a est la variable pour le premier jeton de la division; %%b est la variable pour le deuxième jeton de la division.

7voto

Zimba Points 753
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%

1voto

Satish Ravipati Points 111

Si vous trouvez que le langage de lot n'est pas assez puissant pour faire ce que vous voulez - et il est probable que vous n'atteigniez pas ce point - vous pouvez utiliser le Windows PowerShell. Cela n'est pas installé par défaut sur toutes les versions de Windows, mais vous pouvez le télécharger gratuitement.

Si vous n'aimez pas le langage PowerShell, il y a Perl. Vous devrez l'installer sur tous les systèmes cependant. Il y en a d'autres aussi.

0voto

Alex D. Points 1

Cela extraira le dernier jeton d'une chaîne avec n'importe quel nombre de jetons et n'importe quel type de délimiteurs. Dans cet exemple, ECHO affichera "i". Bien que cela nécessite une fonction de boucle, c'est très rapide.

@echo off
set "Var=a_b_c_d_e_f_g_h_i"
call :LoopLastToken "%Var%"
echo "%Var%"
pause
exit

:LoopLastToken
    set "Var=%~1"
    if not "%Var:*_=%"=="%~1" (
    call :LoopLastToken "%Var:*_=%")
exit /b

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X