Publié le :

Générateur de fichier batch pour exécution de programmes SAS

En attente de validation
Attention : Ce code nécessite des droits administrateur.
Le script commence par définir deux variables macro : `SourcePath` pour le chemin du répertoire contenant les programmes SAS© et `batch_file_name` pour le nom du fichier batch de sortie. Il utilise ensuite une macro nommée `%GetFilenames` pour scanner le répertoire `SourcePath` et identifier tous les fichiers se terminant par `.sas©`, tout en excluant ceux qui contiennent le mot 'batch'. Après avoir préparé le fichier batch de sortie en le vidant, il y écrit des commandes initiales, y compris une ligne potentiellement malformée faisant référence à un fichier JSON externe (`@code_sas©_json_prod/dsc_echofile_tolog.json off`) et une commande `pause`. Ensuite, pour chaque programme SAS© identifié (sauf `Check_all_logs.sas©`), il génère une commande dans le fichier batch pour l'exécuter en utilisant `SAS©.exe` avec l'option `-sysin`. Il inclut une logique conditionnelle commentée (préfixée par `::`) basée sur une variable macro `flag` non définie. Enfin, le script ajoute une commande pour exécuter `Check_all_logs.sas©`.
Analyse des données

Type : EXTERNAL


Le script interagit avec le système de fichiers pour lister les programmes SAS dans le répertoire spécifié par `SourcePath`. Il génère ensuite un fichier batch (`.bat`) externe. Aucune donnée SAS (`SASHELP` ou datasets internes créés par le script lui-même) n'est lue ou traitée directement comme source de données par ce script, hormis les noms de fichiers.

1 Bloc de code
Variables Macro
Explication :
Déclare les variables macro `SourcePath` pour le chemin du répertoire des programmes SAS et `batch_file_name` pour le nom du fichier batch à générer.
Copié !
1%let SourcePath = C:\Users\balajim\Desktop\MY CODES;
2%let batch_file_name=batch_all.bat;
3 
2 Bloc de code
Macro / DATA STEP Data
Explication :
Définit une macro qui utilise les fonctions de gestion de répertoire SAS (`dopen`, `dread`, `dclose`) pour lister les fichiers du répertoire spécifié. Un DATA STEP filtre ensuite pour ne conserver que les fichiers `.sas` dont le nom ne contient pas "batch", les stockant dans le dataset `filenames`.
Copié !
1%macro GetFilenames(location);
2 filename _dir_ "%bquote(&location.)";
3 DATA filenames(keep=memname);
4 LENGTH memname $100.;
5 handle=dopen( '_dir_' );
6 IF handle > 0 THEN DO;
7 count=dnum(handle);
8 DO i=1 to count;
9 memname=dread(handle,i);
10 OUTPUT filenames;
11 END;
12 END;
13 rc=dclose(handle);
14 RUN;
15 DATA filenames;
16 SET filenames;
17 where index(memname,".sas")>1 & index(memname,"batch")<1;
18 RUN;
19 
20 filename _dir_ clear;
21%mend;
22 
23%GetFilenames(&SourcePath.);
3 Bloc de code
DATA STEP / FILENAME
Explication :
Initialise le fichier batch de sortie. Un dataset vide est créé puis utilisé pour écrire une seule ligne vide dans le fichier batch, le réinitialisant efficacement. Le `filename outfile` définit le chemin complet du fichier batch.
Copié !
1/*SourcePath - Program path and the batch file output path*/
2/*
3Reads the .sas files in &location.
4*/
5 
6/*To reset all content */
7DATA empty;
8 stop;
9RUN;
10 
11filename outfile "&SourcePath.\&batch_file_name.";
12 
13DATA _null_;
14 SET empty;
15 file outfile;
16 put;
17RUN;
4 Bloc de code
DATA STEP Data
Explication :
Crée le dataset `pg_list__` à partir de `filenames`. Pour chaque nom de fichier (`memname`), il crée une chaîne `program1` qui est le nom du fichier entouré de guillemets doubles, adapté pour une commande batch. Il supprime ensuite les entrées qui contiennent "Check_all_logs".
Copié !
1DATA pg_list__;
2 SET filenames;
3 program1=strip(cats('"',memname,'"'));
4 memname=strip(memname);
5 IF index(program1,"Check_all_logs")>1 THEN delete;
6RUN;
5 Bloc de code
PROC SQL
Explication :
Compte le nombre de programmes SAS à exécuter (stockés dans `pg_list__`) et affiche ce total dans le log SAS via `%put`.
Copié !
1PROC SQL noprint;
2 select count(program1) into :pg_count from pg_list__;
3 QUIT;
4 
5%put "Total No of programs=&pg_count";
6 Bloc de code
DATA STEP Data
Explication :
Écrit les premières lignes dans le fichier batch. Ceci inclut une ligne avec ` @code_sas_json_prod/dsc_echofile_tolog.json off` qui semble être une référence malformée à un fichier ou une commande, puis une instruction `echo` descriptive et une commande `pause` pour attendre une interaction utilisateur.
Copié !
1DATA pg_list_;
2 file "&SourcePath.\&batch_file_name." ;
3 put ' @code_sas_json_prod/dsc_echofile_tolog.json off';
4 put 'echo This batch file will run all programs in directory';
5 put 'pause';
6RUN;
7 Bloc de code
DATA STEP Data
Explication :
Itère sur le dataset `pg_list__` pour ajouter à la fin du fichier batch une commande `call` pour exécuter chaque programme SAS via `SAS.exe`. Une logique conditionnelle `if flag="NO"` est présente pour commenter (`::`) l'appel, mais la variable `flag` n'est pas définie dans le script.
Copié !
1DATA _null_;
2 SET pg_list__;
3 file "&SourcePath.\&batch_file_name." mod ;
4 put 'call "D:\Program Files\SASHome\SASFoundation\9.4\SAS.exe" -sysin ' program1;
5 IF flag="NO" THEN DO;
6 put '::call "D:\Program Files\SASHome\SASFoundation\9.4\SAS.exe" -sysin ' program1;
7 END;
8RUN;
8 Bloc de code
DATA STEP Data
Explication :
Ajoute une dernière commande au fichier batch pour exécuter le programme `Check_all_logs.sas`.
Copié !
1DATA _null_;
2 file "&SourcePath.\&batch_file_name." mod ;
3 put 'call "D:\Program Files\SASHome\SASFoundation\9.4\SAS.exe" -sysin "Check_all_logs.sas " ';
4RUN;
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.
Banner
Le Conseil de l'Expert
Expert
Michael
Responsable de l'infrastructure Viya.
« L'intérêt majeur de ce script est sa capacité d'auto-découverte : en scannant dynamiquement le répertoire via les fonctions DOPEN et DREAD, il s'adapte automatiquement à l'ajout ou à la suppression de fichiers sans intervention humaine. La génération d'un fichier .bat centralisé permet de transformer un dossier de travail en un pipeline d'exécution ordonné, tout en incluant une étape cruciale de contrôle final avec le programme Check_all_logs.sas »