web-dev-qa-db-fra.com

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

Supposons que ma valeur, telle que "Abc_123", soit stockée dans une variable dans un fichier batch (cmd). Je veux me retrouver avec une variable qui ne contient que "123". Y a-t-il une manière intégrée de faire ceci?

Je ne suis pas très difficile en termes de méthode ou de performances, tant qu'il est intégré à un système Windows typique (Vista/2008).

12
Ken

Utilisez la syntaxe de la 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
26
John T

Si vous voulez juste tout après le trait de soulignement (et que vous ne connaissez pas nécessairement la longueur de la chaîne ni où se trouve le trait de soulignement, mais que vous pouvez compter sur un seul trait de soulignement), 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 trait de soulignement comme délimiteur (delims = _). Seul le second (jetons = 2) sera transmis (en tant que variable %% a) à la boucle for. La boucle ne s'exécutera qu'une seule fois puisqu'il s'agit d'une seule chaîne dans ce cas.

Si vous souhaitez enregistrer les éléments avant et après le trait de soulignement, essayez:

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

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

1
DocOc

Si vous constatez que le langage de traitement par lots n'est pas assez puissant pour faire ce que vous voulez (et que cela ne vous prendra probablement pas trop de temps), vous pouvez utiliser le Windows PowerShell . Ce 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 existe Perl. Vous devrez cependant l'installer sur tous les systèmes. Il y en a d'autres aussi.

0
Wayne Johnston