Pipe-Funktion Directory mit Blanks

Hallo zusammen,

ich habe ein kleines SAS-Macro geschrieben zur Dokumentation unserer SAS-Programme. In diesem Macro-Programm geschieht in kurzen Worten folgendes:

Es wird jeweils dokmentiert (d.h. in eine SAS-Tabelle rausgeschrieben), wann welches Programm von welchem Anwender erstellt, zuletzt modifiziert und zuletzt abgeschickt wurde).

Hier der Quelltext:


/* Macro zur Programm-Dokumentation */

%macro documentation (autor, anwender, datum_erst_erstellung, version, sparte, projekt, beschreibung);

libname doku
'u:\dokumentation';

%global pprogpath ppnamefull ppath;

%let pprogpath  =;
%let ppnamefull =;
%let ppath      =;

data _null_;
   set sashelp.vextfl;
       if (substr(fileref,
1,3)='_LN' or substr
           (fileref,
1,3)='#LN' or substr(fileref,1,3)='SYS') and
           index(upcase(xpath),
'.SAS') > 0 then do;
           call symput(
"pprogpath",trim(xpath));
    end;
run;

%let ppnamefull = %scan(&pprogpath,-1,\/);
%let ppath      = %substr(&pprogpath, 1, %index(&pprogpath,&ppnamefull)-1);

filename foo1 pipe
"dir &ppath.&ppnamefull. /t:c  /a:-d ";   
             
data test_1;                                                                                                                            
  infile foo1 firstobs=
6;   
  input cr_date $
1-10 cr_time $ 13-17;
  if cr_date eq
"  " then stop;                                                                                                            
run;                                                                                                                                    

proc sql noprint;
    select cr_date into : cr_date
    from test_1;
quit;

proc sql noprint;
    select cr_time into : cr_time
    from test_1;
quit;

proc delete data = test_1;
run;
 
filename foo2 pipe
"dir &ppath.&ppnamefull. /t:w /a:-d";

data test_2;                                                                                                                            
  infile foo2 firstobs=
6;                                                                                                                
  input mod_date $
1-10  mod_time $ 13-17;
  if mod_date eq
"  " then stop;
run;

proc sql noprint;
    select mod_date into : mod_date
    from test_2;
quit;

proc sql noprint;
    select mod_time into : mod_time
    from test_2;
quit;

proc delete data = test_2;
run;

data work.doku;

format programm_name              
$200.;         
format sparte                     
$100.;                  
format projekt                    
$200.;         
format autor                      
$50. ;          
format anwender                   
$50. ;        
format pfad_name                
$250.;          
format datum_erst_erstellung     
$10. ;
format zeit_erst_erstellung      
$5.  ;
format datum_mod                
$10. ;
format zeit_mod                    
$5.  ;
format datum_letzter_lauf        
$10. ;
format zeit_letzter_lauf        
$5.  ;
format version                    
$4.  ;
format beschreibung                
$255.;

programm_name                     =
"&ppnamefull.";
sparte                            =
"&sparte.";
projekt                           =
"&projekt.";
autor                             =
"&autor.";

%if "&anwender." = "" %then %do;
anwender                          =
"&autor.";
%end;
%else %do;
anwender                          =
"&anwender.";
%end;
pfad_name                         =
"&ppath.";
datum_erst_erstellung             =
"&cr_date.";
datum_erst_erstellung             = trim(substr(datum_erst_erstellung,
7,4)||"-"||substr(datum_erst_erstellung,4,2)||"-"||substr(datum_erst_erstellung,1,2))    ;
zeit_erst_erstellung              =
"&cr_time.";
datum_mod                          =
"&mod_date.";
datum_mod                          = trim(substr(datum_mod,
7,4)||"-"||substr(datum_mod,4,2)||"-"||substr(datum_mod,1,2))    ;
zeit_mod                          =
"&mod_time.";
version                           =
"&version.";
datum_letzter_lauf                =
"%sysfunc(date(),YYMMDD10.)";
zeit_letzter_lauf                 =
"%sysfunc(time(),time8.)";
beschreibung                      =
"&beschreibung.";

label programm_name               =
"Programm-Name"
      
sparte                      = "Sparte"
      
projekt                     = "Projekt-Name"
      
autor                          = "Autor"
      
anwender                    = "Anwender"
      
pfad_name                      = "Pfad-Name des Programms"
      
datum_erst_erstellung     = "Datum der ersten Erstellung"
      
zeit_erst_erstellung      = "Zeit der ersten Erstellung"
      
datum_mod                    = "Datum der letzten Modifizierung"
      
zeit_mod                    = "Zeit der letzten Modifizierung"
      
datum_letzter_lauf        = "Datum des letzten Laufes"
      
zeit_letzter_lauf            = "Zeit des letzten Laufes"
      
version                    = "Versions-Nummer des Programms"
      
beschreibung                = "Beschreibung des Programms"
;

run;

proc append base = doku.doku_total
             data = work.doku force;
run;

proc sort data = doku.doku_total;
by descending datum_letzter_lauf descending zeit_letzter_lauf;
run;

proc delete data = work.doku;
run;

%mend documentation;

%documentation         (autor                 = Roman Kolbe,
                     anwender               = ,
                     version               =
1.0,
                     sparte                = Test,
                     projekt               = Testprojekt,
                     beschreibung           = Beschreibungstext
);


Immer dann, wenn allerdings in dem Windows-Pfad, in dem das Programm abgespeichert worden ist, Blanks stehen, funktioniert die DIR-Anweisung in der PIPE-Funktion nicht. Ohne Blanks im Namen des Verzeichnisses läuft das Macro einwandfrei.

Hat jemand eine Idee, woran das liegen könnte bzw. einen Lösungsvorschlag?

Vielen Dank im voraus.

Gruß Roman Kolbe

%bquote()

Das Problem besteht darin, daß Windows versucht, alles nach dem ersten Leerzeichen als Argument des DIR-Befehls zu interpretieren, was natürlich mißlingt. Der Dateipfad muß daher ebenfalls in Hochkommata gesetzt und so an Windows übergeben werden.

filename foo1 pipe "dir "&ppath.&ppnamefull" /t:c  /a:-d ";   
klappt jedoch nicht, da SAS die Hochkommata nicht wie Klammern schachteln kann. Mit einer Mischung aus einfachen (') und doppelten (") Hochkommata wird die Macro-Variable nicht aufgelöst. Die Lösung ist die %bquote() Funktion, die die inneren Hochkommata maskiert.
filename foo1 pipe "dir %bquote("&ppath.&ppnamefull") /t:c  /a:-d ";   
Beste Grüße

Perfekt

Vielen Dank für die Lösung, funktioniert nun einwandfrei!!!

Gruß Roman Kolbe