2019年8月1日木曜日

今実行しているプログラムのパスを取得する話

プログラムの保存場所を取得する話はあっちこっちで見かけます。
いちいちパスを変更しなくて良くなるので事故が減るのは良い事ですね。
何度パスを変え忘れがあって意図しないところに出力したかわかりません。

sysinから取ったりSAS_EXECFILEPATHから持ってきたりと色んな手がありますね。
sysinはバッチモードで取れてくるんでしたっけ、私は専らSAS_EXECFILEPATHを使っているので詳しくわかりませんが。以下の2行を実行すると、プログラムの現在のパスとファイル名が取れます。

%let _fullpath = %sysget(SAS_EXECFILEPATH);
%put &=_fullpath ;

ここまではよくあるのですが、先日プログラムのパスの一個上の階層を取りたい時がありました。
他の人のプログラムをパクリに行くと以下のような記述があって、".."の意味がさっぱりわからなかったんです。後で調べると".."はSASじゃなくてコマンドプロンプトの書き方のようでした。

x "cd パスの名前";
filename xxpath "..";
%let _rootdir=%sysfunc(pathname(xxpath));

xコマンド使っているところを見落としていたんですね・・・CDでパスに移動して、その一個上を".."で取得しています。
取得したパスをxxpathで格納して、それをマクロ変数に回収している書き方ですね。CMDでの書き方なので、filename xxpath "..\..\.."; と書けば3個上が取れたり、
filename xxpath "..\hoge"; とすると「1個上のパスのhogeフォルダ」までのパスが取れたりと割と柔軟に指定出来ますね。

あんまりやりすぎるとプログラムが複雑になりますが、変更忘れを防ぐには自動取得がいいかもです