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.
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 | %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; |