Publié le :
Administration CREATION_INTERNE

Exécution de commandes système via SAS

En attente de validation
Attention : Ce code nécessite des droits administrateur.
Le programme démontre trois approches pour envoyer des commandes au système (Shell) : 1) L'instruction 'call system' dans un Data Step pour une exécution silencieuse sans retour. 2) L'instruction 'filename pipe' pour récupérer le résultat d'une commande système dans une table SAS©. 3) Une macro-programme personnalisée '%CmdLine' qui encapsule la méthode 'pipe' pour offrir une syntaxe simplifiée permettant soit d'afficher le résultat dans la log, soit de le stocker dans une table de sortie.
Analyse des données

Type : CREATION_INTERNE


Les données sont générées dynamiquement en capturant la sortie standard (stdout) des commandes système exécutées (par exemple, le listing de fichiers via 'ls').

1 Bloc de code
DATA STEP
Explication :
Exécution d'une commande système 'cp' (copie de fichier) via la routine 'call system'. Cette méthode n'attend pas de retour de données dans SAS.
Copié !
1 
2DATA _NULL_;
3call system("cp /home/nico/sasrep/test.sas /home/nico/sasrep/test1.sas");
4RUN;
5 
2 Bloc de code
DATA STEP Data
Explication :
Utilisation d'un 'filename pipe' pour exécuter la commande 'ls' et lire son résultat directement dans le Data Step via 'infile', créant ainsi la table 'cmdresult'.
Copié !
1filename lsdir pipe "ls /home/nico/sasrep";
2DATA cmdresult;
3 LENGTH file $ 300;
4 INFILE lsdir truncover;
5 INPUT file $300.;
6RUN;
7PROC PRINT DATA=cmdresult;
8RUN;
3 Bloc de code
MACRO
Explication :
Définition de la macro '%CmdLine' qui généralise l'approche 'filename pipe'. Elle accepte la commande à exécuter et une table de sortie optionnelle. Si aucune table n'est spécifiée, le résultat est écrit dans la log via 'Put'.
Copié !
1%macro CmdLine(cmd,TABLE=_NULL_);
2 /*Do not confuse CMD and the macro-variable &CMD*/
3 %local CMD ;
4 Filename CMD Pipe
5 %IF %qsubstr(&CMD,1,1) ~= %str(%")
6 %then "&CMD";
7 %ELSE &CMD;;
8 %put $ &CMD;
9 %IF &TABLE ne _NULL_
10 %THEN %put => &TABLE ;;
11 /* If the table parameter is not assigned. a dataset _NULL_ is generated */
12 DATA &TABLE;
13 LENGTH LINERESULT $300;
14 INFILE CMD truncover;
15 INPUT LINERESULT $300.;
16 %IF &TABLE = _NULL_
17 %THEN Put LINERESULT;;
18 RUN;
19 /*execute the filename :*/
20 filename CMD;
21%mend CmdLine;
4 Bloc de code
MACRO CALL Data
Explication :
Appel de la macro '%CmdLine' pour lister un répertoire et stocker le résultat dans la table 'work.test', suivi de l'affichage de cette table.
Copié !
1%CmdLine(cmd=%bquote(ls /home/nico/sasrep),TABLE=test);
2PROC PRINT
3DATA=work.test;
4RUN;
5 
5 Bloc de code
MACRO CALL
Explication :
Appel de la macro pour exécuter une commande de copie sans stocker de résultat (table par défaut _NULL_).
Copié !
1%CmdLine(cmd="cp /home/nico/sasrep/test.sas /home/nico/sasrep/test1.sas");
2 
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 : Author(s) : Nicolas DUPONT


Banner
Le Conseil de l'Expert
Expert
Simon
Expert SAS et fondateur.
« Contrairement aux procédures natives, les commandes système ne renvoient pas toujours un code retour explicite dans le journal SAS. Après un CALL SYSTEM, vérifiez systématiquement la valeur de la variable automatique &SYSRC. Une valeur différente de 0 indique généralement un échec de la commande au niveau du système d'exploitation. »