Macros 在宏变量中调用系统输出

Macros 在宏变量中调用系统输出,macros,sas,aix,Macros,Sas,Aix,我想在AIX中获得csv文件的文件大小,并使用下面的X和Call系统命令来完成。问题是我无法在宏变量中获得“文件大小”,我将在程序中稍后使用该变量 data _null_; call system('du -g p_bhj_c_hh100uk01po1.csv'); call symput('space','X du -g p_bhj_c_hh100uk01po1.csv'); %put &space; run; WARNING: Apparent symb

我想在AIX中获得csv文件的文件大小,并使用下面的X和Call系统命令来完成。问题是我无法在宏变量中获得“文件大小”,我将在程序中稍后使用该变量

data _null_;
    call system('du -g p_bhj_c_hh100uk01po1.csv');
    call symput('space','X du -g p_bhj_c_hh100uk01po1.csv');
    %put &space; 
run;


WARNING: Apparent symbolic reference SPACE not resolved.

首先,您调用的SYMPUT子例程的工作方式与您试图使用它的方式不同(alaperl)。我建议您阅读有关它的文档

空间宏上出现的错误是因为它位于数据步骤内。宏为您“写入”SAS代码,因此在执行数据步骤之前,它将尝试解析
&SPACE

下面是一个代码示例,用于执行您正在查找的操作:

data _null_;
rc = filename("ref","e:\temp\reg.pdf");
fid = fopen("ref");
infonum = foptnum(fid);
do i=1 to infonum;
    infoname = foptname(fid,i);
    infoval=finfo(fid,infoname);
    put infoname= infoval=;
end;
close = fclose(fid);
run;

/*In Windows, attribute is "File Size (bytes)"*/
data _null_;
rc = filename("ref","e:\temp\reg.pdf");
fid = fopen("ref");
size=finfo(fid,"File Size (bytes)");
call symput("size",size);
close = fclose(fid);
run;
%put &size;

文件大小属性在AIX中可能不同。运行第一部分以查看所有可用属性。然后相应地修改第二个。同样,您需要添加调用以生成文件,就像您已经在做的一样。

谢谢@DomPazz。这肯定会奏效。尽管我在执行第一个程序时收到一个错误“error:Invalid DO loop control information,INITIAL或TO表达式缺失,BY表达式缺失、为零或无效”在第一个数据步骤中(在do之前)。听起来似乎无法打开该文件。幸运的是,第二个文件工作正常。不知道为什么。再次感谢@DomPazz