One method for passing a DOS command to the host system is to use the PIPE option in a FILENAME.
A utility macro programme to issue a DOS Command might look like this:
%macro dos_cmd (cmd) ; %local f_ref rc rc2 cmd_scrape ; *** Generate a FILEREF using a DOS PIPE *** ; %let rc = %sysfunc (filename (f_ref, &cmd, pipe)) ; %if &rc = 0 %then %do ; *** Open the FILEREF using Sequential Access *** ; %let rc2 = %sysfunc (fopen (&f_ref, s)) ; %if &rc2 ne 0 %then %do ; *** Read a record from the FILEREF into a File Data Buffer *** ; %do %while(%sysfunc(fread(&rc2)) = 0) ; *** Copy data from the File Data Buffer into a variable, then write the line into the LOG *** ; %let rc3 = %qsysfunc(fget(&rc2,cmd_scrape,400)) ; %put &cmd_scrape ; %end ; *** Close the FILEREF *** ; %let rc2 = %sysfunc (fclose (&rc2)) ; %end ; %else %do ; %put ERROR: The Command could not be executed: %sysfunc(sysmsg()). ; %end ; *** De-assign the FILEREF *** ; %let rc = %sysfunc (filename (fileref)) ; %end ; %else %do ; %put ERROR: The Command Box could not be accessed. ; %end ; %mend dos_cmd;
Passing the DOS Command as a macro parameter may require Macro Quoting to mask special characters:
%dos_cmd(%nrstr(cd c:\ && dir /og))
This is a double, conditional command: firstly cd c:\
causes the directory to change from the default to the C: Drive, a single &
would then execute the next DOS Command, the double &&
will only execute the next command on successful completion of the first. The second command dir /og
lists the direcory contents in alphabetical (O)rder (G)rouped by type.