Pourquoi ce script est-il indispensable pour votre administration ?
Résolution des variables système : L'intelligence de cette macro réside dans l'utilisation de sysget() pour traduire les préfixes comme !SASROOT en chemins réels. Sans cette étape, votre audit de configuration resterait "virtuel" et incomplet.
Gestion multiplateforme : Le traitement spécifique de l'expansion du tilde (~) démontre une haute technicité. En vérifiant que le système n'est pas Windows (sysscp ^= 'WIN'), le code s'assure d'une interprétation correcte des répertoires personnels sous Unix/Linux, évitant ainsi les erreurs de résolution de chemins.
Audit de filerefs : En utilisant la fonction pathname(), le script est capable de déterminer si un élément de la liste est un chemin direct ou un alias (fileref), offrant ainsi une cartographie exhaustive de vos sources de macros.
Le script ne lit pas de données externes. Il génère une table de données nommée 'paths' dans la librairie WORK. Le contenu de cette table est dérivé de la valeur de l'option système SAS 'SASAUTOS'.
1 Bloc de code
DATA STEP Data
Explication : Ce bloc définit la macro `%getautos`. Elle utilise une étape DATA pour traiter la chaîne de caractères obtenue via `GETOPTION('sasautos')`. La logique parcourt la chaîne, extrait chaque chemin en utilisant la fonction `SCAN`, gère les guillemets, et effectue des substitutions pour les variables d'environnement (via `SYSGET`) et le tilde (`~`). La fonction `PATHNAME` est utilisée pour résoudre les filerefs. Chaque chemin valide est ajouté à la table de sortie spécifiée par le paramètre `out`.
Copié !
%macro getautos(out=paths);
data &out ( keep = path ) ;
length q $ 32000 temp $ 300 var path $ 255 ;
q = getoption ( "sasautos" ) ;
*-- remove surrounding (), and internal quotes;
if index ( q , "(" ) then
q = left(translate ( q , " " , "()'\"" )) ;
do while ( 1 ) ;
temp = scan ( q || "***" , 1 , "() " ) ;
if temp = "***" then leave ;
q = left(substr ( q , length ( temp ) + 1)) ;
if temp =: "!" then
do ;
var = scan ( temp , 1 , "!/\ " ) ;
temp = tranwrd ( temp , '!' || trim(var)
, sysget(trim(var)) ) ;
end ;
*-- do tilda expansion. Works for ~/ and ~user/ where user is
the current user;
if temp =: "~" & symget('sysscp') ^= 'WIN' then
do ;
var = scan ( temp , 1 , "~/\" ) ; put var=;
home = sysget('HOME'); put home=;
if var = ' '
then temp = tranwrd( temp, '~', sysget('HOME'));
else do;
userid = sysget('USER'); put userid=;
temp = tranwrd( temp, '~' || trim(userid), sysget('HOME'));
put temp=;
end;
end ;
*-- Check for a fileref;
path = pathname ( temp ) ;
if path = " " then path = temp ;
if index ( path , "(" ) then
do ;
q = trim(left(translate(path, " ", "()'\"""))) || " " || trim ( q ) ;
end ;
else
if path ^= "***" then
output ;
end ;
run ;
%mend;
1
%macro getautos(out=paths);
2
DATA &out ( keep = path ) ;
3
LENGTH q $ 32000 temp $ 300 var path $ 255 ;
4
q = getoption ( "sasautos" ) ;
5
6
*-- remove surrounding (), and internal quotes;
7
IF index ( q , "(" ) THEN
8
q = left(translate ( q , " " , "()'\"" )) ;
9
10
DO while ( 1 ) ;
11
12
temp = scan ( q || "***" , 1 , "() " ) ;
13
14
IF temp = "***"THEN leave ;
15
16
q = left(substr ( q , LENGTH ( temp ) + 1)) ;
17
18
IF temp =: "!"THEN
19
DO ;
20
var = scan ( temp , 1 , "!/\ " ) ;
21
temp = tranwrd ( temp , '!' || trim(var)
22
, sysget(trim(var)) ) ;
23
END;
24
25
*-- do tilda expansion. Works for ~/ and ~user/ where user is
Explication : Ce bloc exécute la macro `%getautos` avec ses paramètres par défaut, ce qui crée la table `work.paths`. Ensuite, `PROC PRINT` est utilisée pour afficher le contenu de cette table résultante dans la fenêtre de sortie.
Copié !
%getautos();
proc print data = paths ; run ;
1
%getautos();
2
PROC PRINTDATA = paths ; RUN ;
3 Bloc de code
DATA STEP
Explication : Cette étape `_NULL_` n'a pas pour but de créer une table SAS. Elle utilise une instruction `FILE PRINT` pour écrire des informations dans la sortie standard (ou le log). Elle récupère et affiche la valeur de la variable d'environnement `SASROOT` via `SYSGET`, puis la valeur brute de l'option `SASAUTOS`. Elle effectue ensuite quelques manipulations de chaînes (`COMPBL`, `COMPRESS`) sur la valeur de `SASAUTOS` et affiche les résultats.
Copié !
data _null_;
file print;
length sasautos $32000 sasroot $200;
sasroot = sysget('SASROOT');
put 'SASROOT:' sasroot=;
sasautos = getoption('sasautos');
put sasautos=;
sasautos = compbl(sasautos);
put sasautos=;
sasautos = compress(sasautos, '("'')');
put 'SASAUTOS:' sasautos=;
run;
1
DATA _null_;
2
file PRINT;
3
LENGTH sasautos $32000 sasroot $200;
4
sasroot = sysget('SASROOT');
5
put 'SASROOT:' sasroot=;
6
sasautos = getoption('sasautos');
7
put sasautos=;
8
sasautos = compbl(sasautos);
9
put sasautos=;
10
sasautos = compress(sasautos, '("'')');
11
put 'SASAUTOS:' sasautos=;
12
RUN;
L'Astuce Pro
Utilisez ce script lors de vos phases de débogage pour identifier les conflits de noms de macros. Si deux dossiers contiennent une macro identique, SAS exécutera celle située dans le premier chemin listé par SASAUTOS. Ce programme vous permet de valider cet ordre de priorité en un clin d'œil.
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.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.