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

29

Supposons que j'ai une valeur telle que "Abc_123" qui est stockée dans une variable dans un fichier batch (cmd). Je veux finir avec une variable qui ne contient que "123". Existe-t-il un moyen intégré de le faire?

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

Ken
la source

Réponses:

40

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
John T
la source
4
Vous pouvez voir la syntaxe complète avec help setcomme mentionné dans Quelle est la meilleure façon de faire une sous-chaîne dans un fichier batch? sur StackOverflow.
User5910
1
Si j'avais besoin que ces 4 et 3 soient des entrées variables, comment ferais-je cela? %string:~%start%,%len%%
MakPo
ça ne fait rien. J'ai trouvé la réponse. ss64.com/nt/syntax-substring.html
MakPo
3
Pour résumer le lien de @MakPo: utilisez CALL, commeCALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny
8

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 ou où se trouve le trait de soulignement, mais que vous pouvez compter qu'il n'y a qu'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 puisque vous avez affaire à 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 du deuxième jeton de la division.

DocOc
la source
3

Si vous trouvez que le langage batch n'est pas assez puissant pour faire ce que vous voulez - et cela ne vous prendra probablement pas trop de temps pour arriver à ce point - vous pouvez utiliser 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 y a Perl. Vous devrez cependant l'installer sur tous les systèmes. Il y en a aussi d'autres.

Wayne Johnston
la source
La question ne se pose pas sur Powershell ou Perl
Zimba
2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%
Zimba
la source
3
Qu'est-ce que cela fait spécifiquement?
Pimp Juice IT
Oh, si vous demandiez comment ce code fonctionne: il supprime tout avant le numéro, précédé d'un trait de soulignement.
Zimba
@Zimba existe-t-il un moyen de simplement l'étendre à "dernier _"? Où puis-je trouver cela dans toute documentation?
TWiStErRob
Ok, trouvé une documentation, ajoutée pour répondre. Des questions se posent toujours: comment puis-je rendre *gourmand? J'ai utilisé un bon vieux IF NOT ... GOTO :replace, mais ce serait bien s'il y avait une meilleure façon.
TWiStErRob
1
@TWiStErRob: Je vois. Si vous ne savez pas combien _il y en a, passez en boucle au dernier, puisset var
Zimba