Маскировка амперсандов при выводе вызова sysget - PullRequest
1 голос
/ 14 января 2020

Чтобы получить имя файла текущей программы SAS, мы можем написать

%put %sysget(SAS_EXECFILEPATH);

Мне так не повезло, что кто-то однажды создал каталог, в котором был указан амперсанд (yikes!). Давайте создадим пример папки C:\temp&other и сохраним нашу программу test.sas здесь в этой папке.

Теперь мой вопрос:

Возможно ли замаскировать вывод %sysget(SAS_EXECFILEPATH), чтобы SAS не пытался разрешить макро-переменную &other?

Легко Решение было бы изменить имя пути, но, к сожалению, не всегда легко, и мне не разрешено менять имя папки.


Мои попытки: Ни одна из nr функций, которые я пробовал, не помогает мне, поскольку они маскируют как %, так и &. Я пробовал следующее (строка с отступом - вывод журнала SAS). Обратите внимание, что %NRQUOTE выводит то же самое, что и «голый» вызов.

%put %sysget(SAS_EXECFILEPATH); 
    /* WARNING: Apparent symbolic reference OTHER not resolved. */
    /* C:\temp&other\test.sas */

%put %nrstr(%sysget(SAS_EXECFILEPATH));
    /* %nrstr(%sysget(SAS_EXECFILEPATH)) */

%put %nrquote(%sysget(SAS_EXECFILEPATH));
    /* WARNING: Apparent symbolic reference OTHER not resolved. */
    /* C:\temp&other\test.sas */

%put %superq(%sysget(SAS_EXECFILEPATH));
    /* WARNING: Apparent symbolic reference OTHER not resolved.*/
    /* ERROR: Invalid symbolic variable name C\TEST&OTHER\TEST.SAS. */

Ответы [ 2 ]

4 голосов
/ 14 января 2020

Используйте шаг data _null_ с call symputx, чтобы создать макропеременную, которая содержит значение sas_execfilepath. Затем вы можете разрешить его с помощью %superq().

data _null_;
    call symputx('sas_execfilepath', sysget('sas_execfilepath'));
run;

%put %superq(sas_execfilepath);

Выход журнала:

C:\temp&other\test.sas
3 голосов
/ 14 января 2020

Чтобы исключить предупреждение о неопределенной макропеременной (и, что еще хуже, возможность ее нахождения и использования существующей макропеременной), вам нужно будет использовать функцию SAS SYSGET () вместо макрофункции% SYSGET ().

Если вы не можете запустить код SAS, вы можете использовать макро функцию% QSYSFUN C (), чтобы запустить функцию SAS и заключить в кавычки возвращаемое значение.

%put %qsysfunc(sysget(SAS_EXECFILEPATH)); 

Если возможно, даже полезно для определения макроса «function»% qsysget () в вашей личной библиотеке автоматического вызова. Возможно, что-то вроде этого:

%macro qsysget(name);
  %if -1=%sysfunc(envlen(&name)) %then %put WARNING: Environment variable "&name" not found.;
  %else %qsysfunc(sysget(&name));
%mend;
...