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
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 | %let SourcePath = C:\Users\balajim\Desktop\MY CODES; |
| 2 | %let batch_file_name=batch_all.bat; |
| 3 |
| 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.); |
| 1 | /*SourcePath - Program path and the batch file output path*/ |
| 2 | /* |
| 3 | Reads the .sas files in &location. |
| 4 | */ |
| 5 | |
| 6 | /*To reset all content */ |
| 7 | DATA empty; |
| 8 | stop; |
| 9 | RUN; |
| 10 | |
| 11 | filename outfile "&SourcePath.\&batch_file_name."; |
| 12 | |
| 13 | DATA _null_; |
| 14 | SET empty; |
| 15 | file outfile; |
| 16 | put; |
| 17 | RUN; |
| 1 | DATA pg_list__; |
| 2 | SET filenames; |
| 3 | program1=strip(cats('"',memname,'"')); |
| 4 | memname=strip(memname); |
| 5 | IF index(program1,"Check_all_logs")>1 THEN delete; |
| 6 | RUN; |
| 1 | PROC SQL noprint; |
| 2 | select count(program1) into :pg_count from pg_list__; |
| 3 | QUIT; |
| 4 | |
| 5 | %put "Total No of programs=&pg_count"; |
| 1 | DATA 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'; |
| 6 | RUN; |
| 1 | DATA _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; |
| 8 | RUN; |
| 1 | DATA _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 " '; |
| 4 | RUN; |