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)