Cours NetRexx

Cours initiation fichiers à l'aide d'un script NetRexx


Télécharger Cours initiation fichiers à l'aide d'un script NetRexx

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


Cours initiation fichiers à l'aide d'un script NetRexx [Eng]

...

Un script rapide

N'importe quel nombre de langages de programmation peut faire le travail court de cette tâche. J'aime Rexx, un langage de script qui allie puissance et facilité d'utilisation. Bien que ces deux objectifs soient normalement en conflit, Rexx inclut une pléthore de techniques de conception pour les combiner: syntaxe simple, formatage libre, insensibilité à la casse, contrôle structuré et modularité, petit noyau d'instructions entouré d'un grand ensemble de fonctions, extensibilité facile, et d'autres nombreuses fonctionnalités.

Vous pouvez rappeler Rexx à partir des kits de ressources Windows pour Windows 2000 et versions antérieures. Ce que vous ne pouvez pas réaliser, c'est qu'il y a aujourd'hui neuf interprètes Rexx libres et open source qui fonctionnent sur toutes les plates-formes, des ordinateurs de poche aux ordinateurs centraux. Tous les interprètes Rexx répondent à la norme internationale Rexx et ajoutent des fonctionnalités supplémentaires à des fins particulières comme des extensions pour la programmation Windows ou Linux, l'orientation complète des objets, la compatibilité Java, des fonctions supplémentaires pour les ordinateurs de poche, des fonctions UNIX, etc. Rexx est un langage de script majeur avec une base solide dans la nouvelle Europe. Le tableau A liste les interprètes libres de Rexx, leurs forces uniques, et où vous pouvez les télécharger.

...

Écrivons le script. Le code de la liste A est un script Rexx standard qui s'exécute sous l'un des interpréteurs Windows Rexx (tels que Regina et Reginald), et implémente une approche simple pour identifier les fichiers volumineux.

Jetez un oeil au script. Vous remarquerez que Rexx est un format libre et insensible à la casse. Space et capitaliser le code comme bon vous semble. Adaptez la langue à vos préférences. Les commentaires apparaissent entre les caractères / * et * / et peuvent être placés sur leurs propres lignes ou entremêlés dans le code. J'ai commencé ce script avec un bloc de commentaire qui définit son but.

Listing A

/ ********************************************** ************** /

/ * TROUVER DE GRANDS FICHIERS * /

/ * * /

/ * Affiche tous les fichiers sur une machine Windows, du plus grand * /

/ * au plus petit, pour une identification facile des gros fichiers obsolètes. * /

/ * * /

/ ********************************************** ************** /

dir_file = 'xx_dir_list.txt' / * La liste DIR va dans ce fichier * /

sort_file = 'xx_sortin.txt' / * La liste DIR filtrée est ici * /

out_file = 'xx_sortout.txt' / * La liste DIR SORTed est ici

'dir c: \ / -c / s>' dir_file / * Liste tous les fichiers sur la machine * /

faire while lines (dir_file)> 0 / * Traiter la liste complète des fichiers * /

line = linein (dir_file) / * Lit une ligne de la liste des fichiers * /

/ * Élimine les lignes vides et les lignes qui n'ont pas de * /

/ * Informations REPERTOIRE ou FICHIER dans celles-ci * /

si line = "" alors itérer

si pos ('

', ligne)> 0, itérez

si pos ('Fichier (s)', ligne)> 0, itérez

si pos ('Liste complète des fichiers', ligne)> 0, itérez

si pos ('Dir (s)', ligne)> 0 alors itérer

Si pos ('Volume dans le lecteur', ligne)> 0, itérer

if pos ('Volume Serial Number', ligne)> 0, puis itérer

/ * Si la ligne contient une instruction DIRECTORY, traitez-la * /

si pos ('Répertoire de', ligne)> 0 alors faites

ligne de valeur d'analyse avec le répertoire de directory_name



si directory_name <> 'c: \' alors

nom_répertoire = nom_répertoire || '\'

fin

/ * Sinon, s'il s'agit d'une ligne avec des informations FICHIER, traitez-la * /

d'autre faire

ligne de valeur d'analyse avec date et heure am_pm taille nom out_line = format (taille, 15) nom_répertoire || nom rc = lineout (sort_file, out_line)

fin

fin

/ * Ferme le fichier de sortie, le trie et l'affiche à l'utilisateur * /

rc = lineout (sort_file) / * Ferme le fichier de sortie * /

'sort / + 1 / r' sort_file '/ o' out_file / * Trier par taille de fichier * /

'wordpad' out_file / * Permet à l'utilisateur d'afficher les gros fichiers * /

sortie 0

Analyse de code

Après le bloc de commentaire, les premières lignes du programme attribuent des noms de fichiers aux variables dir_file, sort_file et out_file. Le premier est le fichier dans lequel se trouve la liste des commandes dir; la seconde est où le script écrit sa liste de fichiers nettoyés ou "filtrés"; et, le dernier est où la commande de tri Windows écrit sa sortie triée.

dir_file = 'xx_dir_list.txt' / * La liste DIR va dans ce fichier * /

sort_file = 'xx_sortin.txt' / * La liste DIR filtrée est ici * /

out_file = 'xx_sortout.txt' / * La liste DIR SORTed est ici * /

La ligne suivante du script montre comment le script émet la commande Windows dir. Rexx interprète une ligne de code, et quoi qu'il ne comprenne pas dans le langage Rexx, il envoie au système d'exploitation (ou à tout autre environnement spécifié), comme une commande:

'dir c: \ / -c / s>' dir_file / * Liste tous les fichiers sur la machine * /

J'ai inclus la première partie de la commande dir entre guillemets simples, ce qui empêche Rexx d'évaluer le code avant de l'envoyer au système d'exploitation. Dans ce cas, cela est nécessaire car sinon Rexx essayera d'interpréter certains symboles (comme le>) de manière incorrecte. Mais je n'ai pas inclus la référence à la variable dir_file entre guillemets, car je veux que Rexx interprète cette variable dans sa valeur (le nom du fichier donné dans l'instruction d'affectation initiale). Donc après l'évaluation, Rexx envoie une commande ressemblant à ceci à la ligne de commande Windows: dir c: \ / -c / s> xx_dir_list.txt

Le script émet la commande dir avec l'indicateur / s de la commande pour fournir une liste complète de tous les fichiers dans tous les répertoires du lecteur. L'indicateur / -c garantit qu'aucune virgule n'apparaît dans les tailles de fichier, pour faciliter le tri de la liste de fichiers par taille plus tard. Bien sûr, vous obtiendrez une liste de fichiers légèrement différente de la commande dir en fonction des commutateurs que vous utilisez et de votre version de Windows. Pour les besoins de ce programme, cela n'a pas vraiment d'importance, tant que le script identifie les plus gros fichiers sur la machine. Vous pouvez également lire dans la lettre de lecteur à traiter, ce qui rend ce script plus flexible, mais je l'ai juste codé en dur comme c: \ pour simplifier l'exemple.

La sortie de la commande dir est envoyée au fichier identifié par la variable dir_file. Ensuite, le script traite toutes les lignes de ce fichier afin d'éliminer les résultats inutiles. Il accomplit ceci par une simple boucle do while, qui utilise les lignes de fonction intégrées pour déterminer s'il y a des lignes dans le fichier d'entrée à traiter:

faire while lines (dir_file)> 0 / * Traiter la liste complète des fichiers * /

Une fois dans la boucle do while, la fonction linein lit une ligne de données du fichier:

line = linein (dir_file) / * Lit une ligne de la liste des fichiers * /

Comme les lignes, linein est une fonction intégrée de Rexx. Les fonctions renvoient des valeurs directement dans le code où elles apparaissent. Rexx dispose d'un petit jeu d'instructions entouré d'une grande bibliothèque de fonctions. Le langage est extensible en ce sens qu'il existe de nombreuses bibliothèques de fonctions gratuites que vous pouvez brancher sur votre code. Après une instruction d'installation initiale, les scripts utilisent n'importe quelle fonction externe comme une fonction intégrée. Cela fournit un moyen simple et cohérent d'étendre la puissance et la fonctionnalité de la langue sans augmenter sa complexité.



La sortie de la commande dir consiste en une étiquette fournissant un nom de sous-répertoire et une liste de fichiers dans ce sous-répertoire. Un exemple apparaît est montré dans la liste B. Notre objectif est de capturer le nom de chaque sous-répertoire, ainsi que les noms et les tailles de fichiers. Nous voulons éliminer les lignes superflues, par exemple celles qui contiennent

, les lignes récapitulatives et toutes les lignes vides. Ces lignes superflues sont indiquées en rouge, tandis que les lignes contenant les noms de sous-répertoires sont en bleu:

Listing B

Répertoire de c: \ project_files \ SAP Mappage 2 \ ajout de types de données

03/01/2005 21:01

.

03/01/2005 21:01

..

10/20/2004 03:52 PM 114688 Disposition des fichiers pour les conversions - MF Vs SAP.xls

1 fichier (s) 114688 octets

Répertoire de c: \ project_files \ SAP Mapping 2 \ déjà dans prod

03/01/2005 21:01

.

03/01/2005 21:01

..

05/04/2004 05:56 PM 410112 Conversion d_MD et mappage d'interface.xls

04/21/2004 05:00 PM 73216 d_MD Conversion Layouts.xls

19/07/2004 17h09 409600 Conversion_md Mapping.xls

3 Fichier (s) 892928 octets

Nous allons d'abord éliminer les lignes dans la sortie du répertoire qui contiennent des informations superflues. Ce sont les lignes en rouge plus les lignes vides. Le code ci-dessous utilise la fonction intégrée pos pour identifier les lignes «indésirables» en fonction de leur contenu, tandis que l'instruction itérée passe à la fin de la boucle while while. Ainsi, ce code identifie et ignore la sortie indésirable sans l'écrire dans le fichier de sortie qui sera prochainement envoyé à la commande de tri Windows:

/ * Élimine les lignes vides et les lignes qui n'ont pas de * /

/ * Informations REPERTOIRE ou FICHIER dans celles-ci * /

Si une ligne contient des informations d'étiquette qui identifient un sous-répertoire, le script doit analyser le nom du répertoire pour pouvoir le concaténer à chaque nom de fichier qui apparaît dans ce répertoire. Cela permet au script d'afficher des noms de fichiers entièrement qualifiés à l'utilisateur dans la sortie finale. Ces lignes d'étiquette de répertoire sont indiquées en bleu dans la sortie de l'exemple ci-dessus.

Ce code identifie et analyse les lignes bleues et place le nom du répertoire dans la variable nom_répertoire. Il concatène également un backslash final (\) à nom_répertoire, car dans la convention de dénomination de fichier Windows, la barre oblique inverse est utilisée pour concaténer un nom de répertoire en un nom de fichier:

/ * Si la ligne contient une instruction DIRECTORY, traitez-la * /

si pos ('Répertoire de', ligne)> 0 alors faites

ligne de valeur d'analyse avec le répertoire de directory_name si directory_name <> 'c: \' alors

nom_répertoire = nom_répertoire || '\'

fin

Vous remarquerez que Rexx comporte l'ensemble habituel d'instructions de contrôle structurées: différentes formes de do, if, select (cas), return et exit. Si plusieurs instructions doivent être groupées, utilisez une paire de terminaisons do pour indiquer cela. Dans le code ci-dessus, plusieurs lignes suivent la branche then de l'instruction if, de sorte que la branche est enfermée dans un groupement final do do alors. Si une seule instruction suit une, aucune paire de fin n'est nécessaire.

La section de code suivante traite une ligne qui contient des informations de fichier. Ce sont les lignes noires dans la sortie de la commande dir ci-dessus. L'instruction d'analyse analyse la ligne dans ses composants constituants - la date, l'heure, le code am_pm, la taille du fichier et le nom du fichier. Rexx est excellent pour l'analyse et le traitement de chaînes. Comme Python, les expressions régulières ne sont pas intégrées au langage mais peuvent être librement obtenues dans n'importe laquelle des bibliothèques de fonctions libres. Dans ce script j'ai choisi d'écrire quelques lignes de code supplémentaires et de produire une liste plus lisible, plutôt que de développer une expression régulière complexe pour minimiser la longueur du script. Le choix t'appartient.



 / * Sinon, s'il s'agit d'une ligne avec des informations FICHIER, traitez-la * /

d'autre faire

ligne de valeur d'analyse avec date et heure am_pm taille nom

out_line = format (taille, 15) nom_répertoire || nom rc = lineout (sort_file, out_line)

fin

La ligne bleue dans le code ci-dessus construit la ligne de sortie à écrire dans le fichier de tri. Il formate la taille du fichier, puis le concatène avec un seul espace intermédiaire au nom de fichier qualifié complet. Rexx vous permet de concaténer des éléments soit par le biais du symbole de concaténation explicite (||), soit simplement en listant plusieurs éléments sur une ligne. Cette ligne utilise la fonction de formatage pour formater la taille, puis la concatène au nom du répertoire et au nom du fichier.

La ligne rouge du code ci-dessus écrit la ligne dans le fichier sort_file via la fonction intégrée lineout. Le code de retour de la fonction va dans la variable rc. Vous pouvez facilement vérifier les résultats des fonctions, des sous-routines et des commandes du système d'exploitation dans Rexx, mais j'ai conservé ce code en supprimant les erreurs.

Une fois que le script a traité toutes les lignes dans le fichier dir_file, les a analysées et les a écrites dans le fichier sort_file, le script:

  1. Ferme le fichier de sortie
  2. Émet la commande de tri Windows pour trier la liste de fichiers par taille de fichier
  3. Appelle WordPad pour afficher la liste de fichiers triés à l'utilisateur

Voici les lignes du script qui accomplissent cela. Il est facile de générer et d'émettre dynamiquement des commandes de système d'exploitation, puis de traiter leurs codes de retour et leurs sorties. Rexx est un "langage de collage" qui relie d'autres programmes et processus avec peu d'effort:

rc = lineout (sort_file) / * Ferme le fichier de sortie * /

'sort / + 1 / r' sort_file '/ o' out_file / * Trier par taille de fichier * /

'wordpad' out_file / * Permet à l'utilisateur d'afficher les gros fichiers * /

Que faire ensuite

J'ai montré un moyen d'écrire rapidement un script pour identifier les gros fichiers difficiles à localiser qui gaspillent de l'espace disque. Vous pourriez écrire un programme plus court et plus intelligent, mais j'aime l'idée de scripter un langage facile directement de la mémoire. "Fortune-cookie coding" - court, intelligent, obtus scripting - n'est pas la meilleure approche. Un code simple et lisible signifie des scripts plus fiables et une productivité de développement plus élevée.

Il existe plusieurs autres approches que vous pouvez utiliser pour résoudre ce même problème de programmation. Dans un prochain téléchargement, je présenterai un programme qui accède directement au système de fichiers Windows pour traiter ses répertoires et fichiers. Ce qui rend le programme intéressant, c'est qu'il s'appelle chaque fois qu'il rencontre un sous-répertoire qu'il doit traiter. Nous allons donc explorer un exemple de programme récursif qui résout le même problème. La récursivité est une technique puissante qui peut être appliquée à un large éventail de problèmes de programmation.

Le script suivant explore également un peu plus profondément Rexx. Rexx est issu d'une tradition de script complètement différente de Perl, Bash, Korn et de nombreux autres langages de script populaires. Sa philosophie du «pouvoir par la simplicité» en fait un bon complément aux langages qui s'appuient sur une syntaxe complexe pour fournir du pouvoir. Vous pouvez parler couramment Rexx en quelques jours, mais vous ne manquerez pas de puissance à mesure que vos connaissances se développeront.

Howard Fosdick a travaillé avec la plupart des principaux langages de script. Son livre Rexx Programmer's Reference commence par un didacticiel facile et couvre tout ce que vous voulez savoir sur Rexx, ses interfaces et ses outils.



119