Traitement des chaînes de caractères

Au fur et à mesure que vous acquerrez de l'expérience avec les fichiers batch, vous vous apercevrez probablement que vous devez manipuler des chaînes de texte. Vous devrez peut-être demander à un utilisateur son nom ou son mot de passe, traiter une liste de fichiers ou trouver un nom dans une liste de numéros de téléphone. Il s'agit là d'exemples de traitement de chaînes de caractères, c'est-à-dire de manipulation de texte lisible.

 

TCC comprend plusieurs fonctionnalités qui facilitent le traitement des chaînes de caractères. Par exemple, vous pouvez utiliser les  commandes INPUT, MSGBOX et QUERYBOX pour les entrées utilisateur ; les  commandes ECHO et ECHOERR, ECHOS et ECHOSERR, SCREEN, SCRPUT et VSCRPUT pour les sorties ; et la  commande FOR ou la  fonction @FILEREAD pour parcourir les lignes d'un fichier . En outre, les fonctions variables offrent un large éventail de  possibilités de manipulation de chaînes et de caractères.

 

Par exemple, supposons que vous ayez besoin d'un fichier batch qui demande un nom à l'utilisateur, décompose le nom en un prénom et un nom de famille, puis exécute un hypothétique programme LOGIN. LOGIN attend la syntaxe /F:first /L:last avec le prénom et le nom en majuscules et sans qu'aucun des deux noms ne dépasse 8 caractères. Voici une façon d'écrire un tel fichier batch :

 

@echo off

setlocal

unalias *

input Enter your name (no initials): %%name

 

set first=%@word[0,%name]

set flen=%@len[%first]

set last=%@word[1,%name]

set llen=%@len[%last]

 

iff %flen gt 8 .or. %llen gt 8 then

echo First or last name too long

quit

endiff

 

login /F:%@upper[%first] /L:%@upper[%last]

endlocal

 

La  commande SETLOCAL au début de ce fichier batch enregistre l'environnement et les alias. Ensuite, la commande UNALIAS * supprime tous les alias existants afin qu'ils n'interfèrent pas avec le comportement des commandes dans le reste du fichier batch. Le premier bloc de lignes se termine par une  commande INPUT qui demande à l'utilisateur d'entrer un nom. L'entrée de l'utilisateur est stockée dans la variable d'environnement NOM.

 

Le deuxième bloc de lignes extrait le nom et le prénom de l'utilisateur de la variable NOM et calcule la longueur de chacun d'eux. Il stocke le prénom et le nom, ainsi que la longueur de chacun, dans des variables d'environnement supplémentaires. Notez que la  fonction @WORD numérote le premier mot à 0 et non à 1.

 

La  commande IFF du troisième bloc de lignes teste la longueur du nom et du prénom. Si l'un ou l'autre dépasse 8 caractères, le fichier batch affiche un message d'erreur et se termine. (QUERYBOX peut limiter la longueur du texte d'entrée plus simplement avec son  commutateur/L. Nous avons utilisé une méthode un peu plus lourde ci-dessus afin de démontrer l'utilisation des fonctions de chaînes de caractères dans les fichiers batch).

 

Enfin, dans le dernier bloc, le fichier batch exécute le programme LOGIN avec les paramètres appropriés, puis utilise la  commande ENDLOCAL pour restaurer l'environnement et la liste d'alias d'origine. En même temps, ENDLOCAL supprime les variables temporaires utilisées par le fichier batch (NAME, FIRST, FLEN, etc.).

 

Lorsque vous traitez des chaînes de caractères, vous devez également éviter certains pièges courants. Le plus important est la gestion des caractères spéciaux.

 

Supposons que vous ayez un fichier batch avec ces deux commandes, qui acceptent simplement une chaîne et l'affichent :

 

input Enter a string: %%str

echo %str

 

Ces lignes semblent sûres, mais que se passe-t-il si l'utilisateur saisit la chaîne "some > none" (sans les guillemets) ? Une fois la chaîne placée dans la variable STR, la deuxième ligne devient

 

echo some > none

 

Le">" est un  symbole de redirection, de sorte que la ligne fait écho à la chaîne "some" et la redirige vers un fichier appelé NONE -- ce qui n'est probablement pas ce à quoi vous vous attendiez. Vous pourriez essayer d'utiliser des guillemets doubles pour éviter ce genre de problème, mais cela ne fonctionnera pas tout à fait. Si vous utilisez des guillemets arrière (ECHO `%STR`), la commande affichera la chaîne de quatre caractères %STR. Les noms de variables d'environnement ne sont pas développés lorsqu'ils sont entre guillemets.

 

Si vous utilisez des guillemets doubles (ECHO "%STR"), la chaîne saisie par l'utilisateur sera affichée correctement, de même que les guillemets doubles. Avec des guillemets doubles, la sortie ressemblerait à ceci :

 

"some > none"

 

Comme vous pouvez l'imaginer, ce type de problème devient beaucoup plus difficile si vous essayez de traiter du texte provenant d'un fichier. Les caractères spéciaux contenus dans le texte peuvent entraîner toutes sortes de confusions dans vos fichiers batch. Un texte contenant des guillemets inversés, des guillemets doubles ou des symboles de redirection peut être pratiquement impossible à traiter correctement.

 

Une façon de surmonter ces problèmes potentiels est d'utiliser la  commande SETDOS /X pour désactiver temporairement les symboles de redirection et les autres caractères spéciaux. Le fichier batch de deux lignes ci-dessus aurait beaucoup plus de chances de produire les résultats escomptés s'il était réécrit de cette manière :

 

setdos /x-15678

input Enter a string: %%str

echo %str

setdos /x0

 

La première ligne désactive le traitement des alias et désactive plusieurs symboles spéciaux, notamment le séparateur de commandes et tous les symboles de redirection. Une fois la chaîne traitée, la dernière ligne réactive les fonctions désactivées à la première ligne.

 

Si vous avez besoin de fonctionnalités de traitement de chaînes de caractères plus avancées que celles fournies par TCCvous pouvez envisager d'utiliser les langages Lua, Perl, Python, REXX ou Ruby. Nos produits peuvent exécuter des programmes Lua, Perl, Python, REXX et Ruby en interne, et permettent également d'évaluer des expressions Perl, Python, REXX et Ruby en interne.