> Tech > Des guillemets bizarres et capricieux

Des guillemets bizarres et capricieux

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

Une autre erreur de scripting courante vient du moment et de la manière dont on utilise les guillemets quand ils font partie d’une chaîne. D’après Stewart, un exemple classique se produit quand on essaie d’exécuter un outil ligne de commande à partir du code VBScript. S’il faut spécifier un nom

Des guillemets bizarres et capricieux

de chemin d’accès quand on met en action l’outil ligne de commande, on risque des problèmes. Ainsi, supposons que l’on veuille ouvrir C:\My Files\org chart.bmp dans Microsoft Paint. A partir d’une fenêtre shell de commande, on exécutera la commande

mspaint.exe "C:\My Files\org.chart.bmp"

Si l’on essaie d’exécuter cette commande à partir du code VBScript sans mettre C:\My Files\org chart.bmp entre guillemets, comme dans le code du renvoi A du listing 1, la commande échoue à cause de l’espace dans le nom de fichier, et Paint produit le message d’erreur C:\My.bmp was not found. En revanche, si l’on ajoute simplement les guillemets de part et d’autre du nom de chemin d’accès, comme dans le renvoi B, la commande échoue également parce que le moteur de scripting interprète le second guillemet (celui qui précède la lettre capitale C:) comme la fin de la chaîne. On recevra alors le message d’erreur Expected end of statement.

Vous pouvez corriger de plusieurs manières ce genre de problème de scripting. La méthode la plus facile et la plus sûre consiste à faire « échapper » le caractère, c’est-à-dire le flanquer d’un drapeau. Il manque à VBScript un vrai caractère d’échappement (un caractère servant à préserver la valeur littérale du prochain caractère qui suit), donc vous utilisez un autre guillemet. Comme le montre le renvoi C, faire échapper un guillemet avec un autre guillemet semble déroutant. Cependant, si l’on analyse les guillemets un par un, la logique s’éclaire. Le premier guillemet dans le code du renvoi C est facile à comprendre. Le moteur de scripting l’interprète comme le début d’une chaîne. Le moteur de scripting interprète la séquence de deux guillemets avant C: de la manière suivante : le premier guillemet fait échapper le second, donc cette séquence est interprétée comme un guillemet littéral. Le moteur de scripting interprète ainsi la séquence de trois guillemets : le premier guillemet fait échapper le second, donc celui-ci est interprété comme un guillemet littéral. Le dernier guillemet du trio est lu comme la fin de la chaîne.

Une autre méthode consiste à utiliser la représentation numérique (appelée aussi équivalent ANSI) pour les caractères guillemet imbriqués de part et d’autre du nom de chemin d’accès. L’équivalent ANSI est Chr(34). Cependant, on ne peut pas simplement remplacer les guillemets par l’équivalent ANSI. Il faut plutôt utiliser l’opérateur de concaténation (&) pour lier entre eux les équivalents ANSI et le nom de chemin d’accès. Pour cette raison, l’utilisation de Chr(34) est complexe et déconseillée le plus souvent.

Il existe d’autres moyens de traiter les guillemets présents dans des chaînes. On peut, par exemple, assigner l’élément entre guillemets à une variable. Quand cet élément est un nom de chemin d’accès, le procédé classique consiste à transmettre le nom de chemin d’accès à partir de la ligne de commande quand on lance le fichier VBScript.

Vous trouverez parfois des scripts qui utilisent des guillemets simples (‘ ‘) au lieu de guillemets doubles. Cette pratique n’est pas recommandée pour plusieurs raisons. Premièrement, bien qu’un guillemet simple soit un caractère valide dans VBScript, c’est aussi le caractère commentaire (celui qui indique que les autres caractères de cette ligne sont des commentaires et pas du code). Si les guillemets simples ne sont pas imbriqués dans une chaîne qui est mise entre guillemets, le moteur de scripting interprète le code qui apparaît après le premier guillemet simple comme un commentaire, et le code échoue. Deuxièmement, dans le WQL (WMI Query Language), le guillemet simple est un caractère réservé (dont nous reparlerons bientôt), susceptible de créer des problèmes. Enfin, si des guillemets simples mis à la place de guillemets doubles peuvent fonctionner pour afficher un message, cette substitution ne marche pas dans tous les cas. Par exemple, le code

Option Explicit
Dim objShell
Set objShell = _ CreateObject(Wscript.Shell)
VBScript.echo _ "The ‘org chart.bmp’ file is open."

s’exécute correctement. En revanche, si vous essayez d’utiliser des guillemets simples dans le code du renvoi C du listing 1, le code échoue avec un message d’erreur indiquant la présence d’un chemin d’accès incorrect.

Un dernier mot sur les guillemets : écrivez les scripts dans un éditeur de texte. Dans l’article « Quick Scripting Tips », Christa Anderson donne ce conseil avisé : « Ne les écrivez pas dans un traitement de texte pour les copier ensuite dans un éditeur de texte à titre de sauvegarde. Les scripts utilisent beaucoup de guillemets. Si votre traitement de texte convertit les guillemets simples en guillemets intelligents, quand vous copierez le script dans l’éditeur de texte, des caractères fantaisistes remplaceront les guillemets et le script ne marchera pas ».

Téléchargez cette ressource

Préparer l’entreprise aux technologies interconnectées

Préparer l’entreprise aux technologies interconnectées

Avec la « quatrième révolution industrielle », les environnements hyperconnectés entraînent de nouveaux risques en matière de sécurité. Découvrez, dans ce guide Kaspersky, comment faire face à cette nouvelle ère de vulnérabilité.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010