Optimisez vos scripts SAS : Automatisez la lecture des variables système en toute sécurité

Niveau de difficulté
Débutant
Publié le :
Michael

Le Conseil de l'Expert

Michael
Responsable de l'infrastructure Viya.

La macro %qgetenv est un utilitaire de bas niveau indispensable pour concevoir des applications SAS portables et dynamiques. Son expertise réside dans sa capacité à faire le pont entre l'environnement d'exploitation (OS) et la session SAS en utilisant la variable automatique &SYSSCP. Cette approche permet d'automatiser la configuration des chemins réseaux ou des identifiants sans coder d'informations sensibles en dur, en s'appuyant sur les variables globales du système Windows ou Unix.

L'aspect le plus pointu de ce code est la gestion du macro-quoting via %qreadpipe et %superq. En sécurisant la résolution de la variable avec %nrbquote, la macro évite que des caractères spéciaux (comme les esperluettes ou les signes de pourcentage) ne soient interprétés prématurément par le processeur macro de SAS, ce qui prévient les erreurs de syntaxe inattendues. Sous Windows, l'astuce consistant à vérifier si le premier caractère est un "%" est une méthode d'expert élégante pour détecter qu'une variable n'a pas été résolue par le système, permettant ainsi un retour de chaîne vide "propre".

Une recommandation d'expert : bien que l'utilisation de echo via un pipe soit efficace, SAS propose nativement la fonction %SYSGET pour accéder aux variables d'environnement. Toutefois, cette macro reste supérieure dans des environnements restreints ou pour capturer des variables systèmes complexes que SAS ne mapperait pas automatiquement au démarrage. Assurez-vous simplement que les options système XCMD sont activées sur votre serveur pour permettre l'exécution des commandes echo.

Attention : Ce code nécessite des droits administrateur.
Cette macro récupère la valeur d'une variable d'environnement spécifiée en paramètre. Elle adapte sa méthode en fonction du système d'exploitation détecté via la variable automatique `&sysscp`. Sous Windows, elle exécute `echo %envvar%` et sous Unix/Linux (ou similaire), elle exécute `echo $envvar`. Le résultat de la commande est lu via la macro `%qreadpipe` (supposée lire la sortie d'une commande système). La valeur retournée est macro-quotée pour une utilisation sécurisée dans d'autres macros. Si la variable d'environnement n'est pas trouvée, la macro retourne une chaîne de caractères vide sans générer d'avertissement dans le journal SAS©.
Analyse des données

Type : EXTERNE


La macro ne lit aucun jeu de données. Sa source d'information est externe à SAS : les variables d'environnement du système d'exploitation sur lequel SAS est exécuté.

1 Bloc de code
Macro
Explication :
Ce bloc définit la macro `%qgetenv` qui prend en entrée le nom d'une variable d'environnement. Elle déclare une variable macro locale `tempres`. Un test conditionnel sur la variable `&sysscp` exécute une commande différente pour Windows (`echo %variable%`) et pour Unix/Linux (`echo $variable`). La commande est passée à la macro `%qreadpipe` pour exécution et capture de la sortie. Pour Windows, un contrôle supplémentaire vérifie si la variable a été résolue, sinon une chaîne vide est retournée. Finalement, la macro retourne le contenu capturé.
Copié !
1%macro qgetenv(envvar);
2 %local tempres;
3 %IF "&sysscp" EQ "WIN" %THEN %DO;
4 %let tempres=%qreadpipe(echo %nrbquote(%str(%%)%superq(envvar)%str(%%)));
5 %*- IF it did not resolve THEN SET to null -;
6 %IF "%qsubstr(%superq(tempres),1,1)" EQ "%" %THEN %let tempres=;
7 %END;
8 %ELSE %let tempres=%qreadpipe(echo $&envvar);
9&tempres
10%mend qgetenv;
L'Astuce Pro
Pour optimiser la récupération de vos variables d environnement sous Windows, remplacez la méthode complexe de lecture via pipe (ECHO) par la fonction intégrée %SYSFUNC(GETENV(&envvar)) : cette astuce technique permet d interroger directement les variables système (comme PATH ou USERNAME) sans invoquer l interpréteur de commandes externe (CMD.EXE), ce qui supprime les risques liés au macro-quoting des caractères spéciaux (%, $, &) et améliore considérablement la rapidité d exécution en évitant les accès réseau ou les processus zombies souvent générés par l instruction PIPE.
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.