Publié le :
Administration CREATION_INTERNE

Exécuter une commande système distante et stocker la sortie dans une macro-variable

En attente de validation
Attention : Ce code nécessite des droits administrateur.
Cette macro, nommée rcmd2mvar, est conçue pour les sessions SAS© capables d'utiliser 'rsubmit'. Elle exécute une commande système passée en paramètre sur le serveur distant. Le mécanisme repose sur une instruction 'filename' de type 'pipe' définie à l'intérieur d'un bloc 'rsubmit'. La sortie de la commande est lue via un 'data step' et stockée dans un dataset temporaire ('_rcmd') dans la librairie 'rwork' du serveur distant. De retour sur la session locale, la macro '%getvalue' (non fournie mais supposée exister) est appelée pour lire la valeur du dataset distant et l'assigner à la macro-variable locale spécifiée. La macro termine en supprimant le dataset temporaire. Elle est optimisée pour les commandes ne retournant qu'une seule ligne de sortie.
Analyse des données

Type : CREATION_INTERNE


Les données sont générées dynamiquement par le script. Il capture la sortie standard (stdout) d'une commande système exécutée sur un serveur distant. Cette sortie est ensuite lue et matérialisée dans un dataset SAS temporaire dans la librairie RWORK.

1 Bloc de code
DATA STEP Data
Explication :
Ce bloc est soumis à exécution sur le serveur SAS distant. Il définit d'abord un 'pipe' nommé '_rcmd' qui exécute la commande système contenue dans la macro-variable '&_rcmd'. Ensuite, une étape DATA lit le flux de sortie de cette commande (via l'instruction INFILE) et stocke la ligne de texte (nettoyée des espaces de fin) dans une variable 'str' au sein d'un nouveau dataset nommé '_rcmd'. Enfin, le 'pipe' est fermé.
Copié !
1RSUBMIT;
2 filename _rcmd pipe "&_rcmd";
3 DATA _rcmd;
4 INFILE _rcmd;
5 INPUT;
6 str=trim(_infile_);
7 RUN;
8 filename _rcmd clear;
9ENDRSUBMIT;
2 Bloc de code
MACRO CALL
Explication :
Cette ligne s'exécute sur la session locale après la fin du bloc RSUBMIT. Elle utilise une macro externe '%getvalue' pour extraire la valeur de la variable 'str' de la première observation du dataset 'rwork._rcmd' (qui se trouve sur le serveur distant) et l'assigne à la macro-variable locale dont le nom est passé dans le paramètre 'mvar'.
Copié !
1%let &mvar=%getvalue(rwork._rcmd,str,1,usequotes=&usequotes);
2 
3 Bloc de code
PROC DATASETS
Explication :
Ce bloc de code exécute la procédure PROC DATASETS pour effectuer une opération de nettoyage. Il supprime le dataset temporaire '_rcmd' de la librairie 'rwork' (sur le serveur distant) afin de ne pas laisser de fichiers inutiles après l'exécution de la macro.
Copié !
1PROC DATASETS nolist lib=rwork;
2 delete _rcmd;
3RUN;
4QUIT;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : This is public domain software. No guarantee as to suitability or accuracy is given or implied. User uses this code entirely at their own risk.


Banner
Le Conseil de l'Expert
Expert
Simon
Expert SAS et fondateur.
« Ce qui fait la force de cette macro, c'est sa légèreté et sa propreté. En se limitant aux commandes retournant une seule ligne, elle minimise le temps de latence réseau entre la session cliente et le serveur.

L'étape finale de nettoyage via PROC DATASETS sur la bibliothèque RWORK est une 'best practice' essentielle : elle assure que chaque appel à la macro laisse l'environnement distant aussi propre qu'il l'a trouvé. C'est un utilitaire robuste pour les administrateurs et développeurs qui souhaitent construire des pipelines de données 'intelligents', capables de s'adapter aux configurations variables des serveurs de production sans intervention manuelle. »