TP2 : Programmation de scripts sous Windows
Transcription
TP2 : Programmation de scripts sous Windows
TP n°2 Système L3 MASS, programmation de scripts Wi ndows Page 1 sur 6 Université Pierre Mendès France U.F.R. Sciences de l’Homme et de la Société Licence MIASS – 3ème année TP2 : Programmation de scripts sous Windows Fichiers de commande 1 Rappels Script Les scripts sont des programmes qui permettent d’automatiser certaines tâches répétitives telles que l’administration ou les sauvegardes de fichiers. Ce sont des fichiers de texte avec l’extension .bat ou .cmd. Ils contiennent les mêmes commandes que celles exécutées en ligne de commande, plus éventuellement des commandes de branchement à des étiquettes (goto, if), et des appels à d’autres scripts (call). Un script contient en général une commande par ligne. Il peut être paramétré. Exécuter un script Batch Pour exécuter un script Batch, il suffit de taper le nom de ce fichier dans la fenêtre de commandes. L’interprète exécute les commandes de manière séquentielle, dans l’ordre où elles apparaissent dans le fichier. Il n’est pas nécessaire de taper l’extension .bat du fichier. La variable PATH Pour pouvoir exécuter un programme, le système d’exploitation doit pouvoir retrouver le fichier correspondant à cette commande. C’est la variable d’environnement PATH qui contient la liste des répertoires que l’interprète explore pour trouver un programme à exécuter, s’il n’est pas dans le répertoire courant. Vos scripts seront donc placés dans le répertoire P:\TP_SYS\BATCH (voir TP n°1). 2 Avant propos 2.1 Objectifs • Comprendre l'utilité et les principes de base de la programmation de scripts sous Windows. • Utiliser les principales fonctionnalités du langage de script : création de fichiers de commandes, passage de paramètres, gestion de fichiers, itérations, conditionnelles, analyses de chaînes, redirections, gestion des erreurs, etc. 2.2 Avant de programmer • • • 3 Vérifiez que le répertoire P:\TP_SYS\BATCH existe et qu’il apparaît dans la variable PATH. Conseil : utilisez l'éditeur de texte SciTE ou Notepad++ pour écrire vos scripts et évitez d’utiliser les caractères accentués qui sont codés différemment sous Windows et dans les fenêtres de commande. Pensez à utiliser votre cours et l'aide en ligne pour la syntaxe des commandes. Scripts à écrire pendant la séance de TD 3.1 Tester l'existence de fichiers et/ou répertoires (fin du TP1) • Créer un fichier de commandes testfic.bat qui reprend l'exemple du cours (ci-contre). • Affichez l'aide de la commande. • Testez cette commande pour un fichier et un répertoire existants/non existants. • Commentez le code : Que représente le %1 ? @echo off if "%1"=="" goto usage if "%1"=="/?" goto usage if exist %1\NUL ( echo le repertoire %1 existe ! ) else ( if exist %1 ( echo le fichier %1 est présent ) else echo %1 est absent ) goto fin :usage echo usage : testfic nomfichier :fin TP n°2 Système L3 MASS, programmation de scripts Wi ndows • Page 2 sur 6 Que fait if exist %1\NUL ? Ce test fonctionne pour les disques au format FAT ou NTFS, mais ne fonctionne pas normalement pour les disques du serveur (format linux). Il existe des alternatives utilisant des commandes d’accès à des répertoires et un test de la condition ERROLEVEL (cf. encadré ci-dessous). ERRORLEVEL : Toutes les commandes renvoient une valeur de retour pour indiquer leur succès (0) ou leur échec (≥1). Cette valeur est accessible par une condition de la forme ERRORLEVEL n qui signifie « le code renvoyé par la commande précédente est ≥ n ». Pour tester si une commande s’est bien déroulée, on fait le test suivant : IF ERRORLEVEL 1 goto erreur Cette instruction a pour effet de se brancher à l’étiquette erreur si la commande précédente a renvoyé un code ≥ 1. • Modifiez votre script en utilisant la commande dir /ad Cette commande échoue si le fichier spécifié n’est pas un répertoire ; elle permet donc de distinguer un fichier d’un répertoire. • Modifiez le script testFic.bat de façon à ce qu'il permette de tester l'existence de plusieurs fichiers ou répertoires (nombre indéfini de paramètres) en utilisant la commande SHIFT et une itération (voir l’exemple donné en cours pour afficher les paramètres d’un script). 3.2 Sauvegarder des fichiers et des répertoires Les scripts Batch peuvent être utiles pour la réalisation de sauvegardes automatiques. • Ecrire la commande creerep.bat qui crée dans le répertoire courant, un répertoire du nom passé en paramètre. Si un répertoire de même nom existe déjà, un message est affiché La commande peut-elle échouer? Dans quelles conditions? En utilisant ERROLEVEL et la redirection de l'erreur standard, modifier votre commande de sorte qu’un message d’erreur compréhensible s’affiche en cas de problème. Rappel : le langage de commande Windows utilise les symboles de redirection identiques à ceux d’UNIX : > et >> permettent la redirection des messages vers un fichier 2> et 2>> permet la redirection des messages d’erreur vers un fichier • Ecrire la commande sauver.bat qui copie des fichiers passés en paramètres dans le répertoire sauvegarde du répertoire courant (à créer s'il n'existe pas). Afficher un message d'erreur si le nom correspond à un répertoire ou si un fichier est absent ; Ecrire un script dateDuJour.bat qui affiche : Nous sommes le Xeme jour du Yeme mois de l’annee Z. Pour extraire une sous-chaine d’une variable, on utilise la syntaxe suivante : %nomvar:~d,lg% nomvar est une variable d’environnement d est l’indice de début de la sous-chaine (0 est l’indice du premier caractère) lg est la longueur de la sous-chaine exemple : si la variable nomvar=tralala, alors %nomvar:~1,3% désigne la chaine "ral" Ajouter l'option /D:j-m-a à la commande sauver.bat qui permet de spécifier une date. Si cette option est utilisée, seuls seront sauvegardés les fichiers dont la date de dernière modification est postérieure à la date donnée en paramètres. Pour la copie des fichiers, on consultera attentivement l’aide de la commande xcopy. TP n°2 Système L3 MASS, programmation de scripts Wi ndows Page 3 sur 6 3.3 Lecture de fichiers, analyses de chaînes, calculs On dispose d’un fichier nommé annuaire.txt contenant une ligne pour chaque utilisateur avec le format suivant : prenom nom:bureau nnn:telephone Exemple de fichier annuaire.txt : #annuaire. Format des enregistrements: #prenom nom:Bureau xxx:tel gerard manvussat:bureau 118:04.76.54.32.32 ivan skivolle:bureau 116:04.76.54.32.33 vincent tim:bureau 116:04.76.54.32.33 debby scott:bureau 120:04.76.54.32.10 justin ticou:bureau 121:04.76.54.32.11 En utilisant la commande FOR, on veut écrire la commande creelogin.bat qui, à partir d'annuaire.txt, crée le fichier annuaire_login.txt en rajoutant le login de chaque utilisateur en début de ligne. Le login est formé de la première lettre du prénom et des 7 premières lettres du nom. Exemple de fichier annuaire_login.txt : #annuaire_login. Format des enregistrements: #login:prenom nom:Bureau xxx:tel gmanvuss:gerard manvussat:bureau 118:04.76.54.32.32 iskivoll:ivan skivolle:bureau 116:04.76.54.32.33 vtim:vincent tim:bureau 116:04.76.54.32.33 dscott:debby scott:bureau 120:04.76.54.32.10 jticou:justin ticou:bureau 121:04.76.54.32.11 La commande FOR permet d’appliquer une commande ou une suite de commandes - soit à un (ou plusieurs) fichiers, - soit à une chaîne de caractères : FOR /F ["options"] %variable IN (ensemble-fichiers) DO commande [paramètres] FOR /F ["options"] %variable IN ("chaîne") DO commande [paramètres] ou FOR /F ["options"] %variable IN (ensemble-fichiers) DO ( commande [paramètres] … ) FOR /F ["options"] %variable IN ("chaîne") DO commande [paramètres] commande [paramètres] ) ensemble-fichiers est un ou plusieurs noms de fichiers. Chaque fichier est ouvert, lu et traité avant de passer au fichier suivant de ensemble-fichiers. Le traitement consiste à lire dans le fichier, le découper en lignes individuelles de texte puis analyser chaque ligne en zéro ou plusieurs parties. Le corps de la boucle FOR est ensuite appelé avec la ou les valeurs de variables prenant la valeur de la ou des parties trouvées. Par défaut, /F transmet la première partie séparée par un espace dans chaque ligne de chaque fichier. Les lignes vides sont ignorées. Vous pouvez outrepasser le comportement d'analyse par défaut en spécifiant le paramètre optionnel "options". Il s’agit d’une chaîne entre guillemets contenant un ou plusieurs mots-clés spécifiant diverses options d'analyse. Les mots-clés sont : eol=c spécifie un caractère de commentaire de fin de ligne (un seul) skip=n spécifie le nombre de lignes à ignorer en début de fichier. delims=xxx spécifie un ensemble de caractères délimiteurs. Ceci remplace l'ensemble de délimiteurs par défaut qui sont l'espace et la tabulation. TP n°2 Système L3 MASS, programmation de scripts Wi ndows Page 4 sur 6 tokens=x,y,m-n spécifie les parties de chaque ligne devant être transmises au corps de FOR à chaque itération. Ceci causera l'allocation de noms de variables supplémentaires. La forme m-n est une étendue spécifiant les parties allant de m à n. Par exemple, la commande : FOR /F "eol=; tokens=2,3 delims=, " %i in (monfich.txt) do echo %i %j analyse chaque ligne de monfich.txt, en ignorant les lignes commençant par un point-virgule, en transmettant les 2nde et 3ème parties de chaque ligne au corps de FOR, les parties étant délimitées par des virgules et/ou espaces. Notez que le corps de FOR référence %i pour l'obtention de la 2nde partie, %j pour l'obtention de la 3ème partie. Si le fichier monfich.txt contient les lignes suivantes : ;exemple de fichier Bonjour Georges;Dupond,vous allez bien ? Oui Marcel Durand je vais bien La commande ci-dessus affiche : Georges;Dupont vous Marcel Durand Lorsque la commande for s’applique à une chaîne et non à un ensemble de fichiers, cette chaîne est traitée de la même manière qu’une ligne de fichier. exemple : FOR /F "tokens=2,3 delims=, " %i in ("Bonjour Georges;Dupond,vous allez bien ?") do ( echo %i %j ) affiche : Georges;Dupont vous Attention : dans un fichier de commande, les variables de la commande FOR s’écrivent avec %% à la place de %. Ainsi la commande donnée en premier exemple s’écrirait de la manière suivante : FOR /F "eol=; tokens=2,3 delims=, " %%i in (monfich.txt) do @echo %%i %%j Option EnableDelayedExpansion Avant la commande FOR, il faut placer la commande suivante dans le fichier de commande : setlocal EnableDelayedExpansion Cette option permet a la boucle for de reconnaitre qu'une variable d'environnement prend différentes valeurs au cours du for. Sans cette option, si on utilise des variables d’environnement dans la boucle FOR, la variable aura toujours la même valeur car FOR itère en considérant par défaut que la valeur de la variable a été fixée et ne changera pas. La variable dont la valeur change dans l’itération est notée !variable! au lieu de %variable% Voici un exemple de réalisation de la commande creelogin.bat @echo off rem on supprime annuaire.txt s'il existe if exist annuaire_login.txt del annuaire_login.txt setlocal EnableDelayedExpansion FOR /f "eol=# tokens=1-5 delims=: " %%a in (annuaire.txt) DO ( set prenom=%%a set nom=%%b echo !prenom:~0,1!!nom!:%%a %%b:%%c %%d:%%e >>annuaire_login.txt ) echo le fichier annuaire_login.txt est cree Modifiez cette commande de sorte que annuaire.txt et annuaire_login.txt soient des paramètres de la commande creelogin.bat TP n°2 Système L3 MASS, programmation de scripts Wi ndows Page 5 sur 6 4 Travail à rendre : lecture de fichiers, analyses de chaînes, calculs Travail à faire individuellement ou en binôme • Pour chacune de vos commandes (scripts), les 3 points suivants doivent être respectés : Votre code doit être commenté et chaque commande doit avoir un en-tête précisant son rôle et ses paramètres. L’utilisateur doit pouvoir obtenir l’aide des fonctions en tapant : nomfonction /? Si l’utilisateur appelle la fonction avec un mauvais nombre de paramètres, un message d’erreur et d’aide approprié doit s’afficher. • A envoyer par mail à [email protected] au plus tard le 15 mars 2015 à 23h59 Attention ! Rendez votre TP avant la date limite. Il y aura 2 points de pénalité par jour de retard. Avant d’envoyer votre TP, renommer tous les fichiers .bat en .bat.txt puis faire un .zip du répertoire contenant tous les scripts : clic droit sur le répertoire -> créer une archive .zip • Vous devez recevoir un mail de confirmation. Si vous ne recevez rien : ce n’est pas bon, renvoyez le tp et demandez confirmation à l’enseignant. Travail à faire individuellement ou en binôme • • Pour chacune de vos commandes (scripts), les 3 points suivants doivent être respectés : Votre code doit être commenté et chaque commande doit avoir un en-tête précisant son rôle et ses paramètres. L’utilisateur doit pouvoir obtenir l’aide des fonctions en tapant : nomfonction /? Si l’utilisateur appelle la fonction avec de mauvais paramètres, un message d’erreur et d’aide approprié doit s’afficher. A envoyer par mail à [email protected] au plus tard le 9 novembre 2014 à 23h59 Attention ! Rendez votre TP avant la date limite. Il y aura 2 points de pénalité par jour de retard. Avant d’envoyer, renommez tous les fichiers .bat en .bat.txt puis faire un .zip du répertoire contenant tous les scripts : clic droit sur le répertoire ⇒ créer une archive .zip. • Vous devez recevoir un mail de confirmation. Si vous ne recevez rien : ce n’est pas bon, renvoyez le tp et demandez confirmation à l’enseignant. 4.1 – Écrire la commande SigneZodiaque.bat qui calcule dans la variable d’environnement SIGNE et affiche le signe zodiacal correspondant à une date donnée. La date est donnée sous la forme de 2 paramètres correspondant respectivement au Jour et au Mois. Les signes du zodiaque correspondent respectivement aux dates suivantes : Signe Période dans l'année Signe Période dans l'année Capricorne du 22 Décembre au 20 Janvier Cancer du 22 juin au 22 juillet Verseau du 21 Janvier au 19 Février Lion du 23 juillet au 23 Aout Poissons du 20 Février au 20 Mars Vierge du 24 Aout au 23 septembre Bélier du 21 Mars au 20 Avril Balance du 24 septembre au 23 octobre Taureau du 21 Avril au 21 Mai Scorpion du 24 octobre au 22 novembre Gémeaux du 22 Mai au 21 Juin Sagittaire du 23 Novembre au 21 Décembre Par exemple, la commande suivante : signezodiaque 14 4 a pour effet d’afficher et de placer dans la variable SIGNE la valeur Belier car le 14/04 correspond bien au signe du zodiacal du Bélier. Pour calculer le signe zodiacal, on pourra définir des variables dont la valeur dépend du mois (jour limite entre 2 signes, noms des signes), et faire le calcul final à l’aide de ces variables. TP n°2 Système L3 MASS, programmation de scripts Wi ndows Page 6 sur 6 Pour savoir si un nombre est supérieur à un autre on peut désormais utiliser la commande if avec l’option /I (consulter l’aide de la commande IF pour plus de détails). La commande suivante affiche oui si la variable A a une valeur supérieure à 20, non sinon : if /I %A% GTR 20 ( echo oui ) else ( echo non ) On utilisera cette méthode pour déterminer le signe zodiacal d’une date donnée (comparaison du jour de la date donnée avec le jour du mois déterminant le changement de signe zodiacal dans le mois. La commande SigneZodiaque.bat vérifiera la présence des paramètres et affichera un message d’aide si un paramètre est manquant. 4.2 – Écrire la commande AfficherSigne.bat qui affiche le signe zodiacal d’une personne donnée. Les paramètres de la commande sont le prénom, le nom et la date de naissance de la personne donnée sous la forme jour-mois-année. Par exemple, la commande suivante : affichersigne Jean Dupont 14-4-1983 a pour effet d’afficher le message suivant : Jean Dupont est né(e) un 14/4 et a pour signe zodiacal Belier Bien entendu, la commande AfficherSigne.bat pourra appeler la commande SigneZodiaque.bat 4.3 – On dispose d’un fichier de texte appelé personnes.txt et contenant une ligne pour chaque personne avec le format suivant : Nom:Prénom:date de naissance:adresse rue:ville:code postal Exemple de fichier personnes.txt : #Fichier de personnes #Nom:Prenom:Date:adresse rue:Ville:Code postal Galle:Martin:12-2-1989:rue des roses:Grenoble:38000 Honnete:Marie:14-9-1990:avenue du général Shi Paoli Vaopo:Paris:75002 Pleur:Jean:13-3-1984:rue des marronniers:Grenoble:38000 Prane:Dolly:19-11-1995:rue des escaliers:Grenoble:38100 Mieu:Jeff-Edmond:22-12-1992:rue des étangs:Grenoble:38000 En utilisant la commande for, et l'extraction de chaîne, écrire la commande CalculerSignes.bat qui affiche, pour chaque personne du fichier, son signe du zodiaque en utilisant la commande AfficherSigne.bat Paramétrez la commande CalculerSignes.bat de sorte que le fichier contenant les informations sur des personnes soit un paramètre de la commande. Conseils : 1) Pensez à : • Commenter votre code et y noter votre (vos) nom(s), • Testez vos scripts séparément, • Gérez les erreurs et les aides en ligne. 2) Si un script ne fonctionne pas, mettez en commentaire la ligne @echo off du script. Vous aurez alors la trace des commandes exécutées et trouverez plus facilement l’origine de l’erreur. 3) Ne vous y prenez pas au dernier moment, commencez aujourd’hui même ! « Quoi que tu veuilles faire, fais-le rapidement. Ne remets pas à demain ce que tu peux faire aujourd’hui ! » (Extrait d’un livre de sagesse tibétaine)