毎月の名前が異なる多くの入力ファイルを必要とするSASプログラムがあります。 Windowsエクスプローラの個々のファイル名をSASのハードコードされたエイリアスに更新するか、新しいファイル名をコピーしてマクロ変数に貼り付けるのではなく、SASが入力を選択できるファイルプロンプトを開始します。私はWindows 7上でSAS 9.4を使用しています。VBScriptからSASへの戻り値を読み取る
この目的のために、ダイアログを開き、選択したファイルのパスまたはダイアログがキャンセルまたはクローズされた場合は空の文字列を返すVBScriptを作成しました。
' GetFilePath.vbs
Option Explicit
Function GetFilePath()
Dim objExec, strMSHTA, wshShell
GetFilePath = ""
strMSHTA = "mshta.exe ""about:<input type=file id=FILE>" _
& "<script>FILE.click();new ActiveXObject('Scripting.FileSystemObject')" _
& ".GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>"""
Set wshShell = CreateObject("WScript.Shell")
Set objExec = wshShell.Exec(strMSHTA)
GetFilePath = objExec.StdOut.ReadLine()
Set objExec = Nothing
Set wshShell = Nothing
End Function
'WScript.Echo GetFilePath()
GetFilePath()
理想的には、私は、マクロ変数にGetFilePath.vbs
の戻り値を割り当てたいです。しかし、私はそれをどうやってやるのかは分かりません。私が見つけた唯一の関連情報は、unnamed pipeを使ってI/Oストリームをデータセットに読み込むことです。私はそれを行うことができたら、少なくともCALL SYMPUT
を使用して、戻り値をマクロ変数に割り当てることができると私は思います。しかし、SASに戻り値を読み取らせることはできません。
私がしようとしてきたものの例は、プロンプトが開きますが、戻り値はpath
に割り当てられていない、
filename getfile pipe "C:\temp\GetFilePath.vbs";
data test;
infile getfile;
input path $;
run;
です。
は、ここで私はテストのために使用され、最小限の作業例です!データセットを作成すると、2つの観測結果が得られます。最初はMicrosoftの免責条項、2番目はファイルパスです。免責条項をオフにするオプションは '// NoLogo'のようです。シェルで 'cscript.exe // NoLogo C:\ temp \ GetFilePath.vbs'を実行すると、実際にはファイルパスだけが取得されます。しかし、SASで同じステートメントを試すと、データセットには何の観測も書き込まれません。何か案は? –
'/ NoLogo'オプションについてはわかりませんが、SASの最初の行を無視するだけで、datastepに次の行を追加してください:' _n _> = 4 then output; '(適切な数を調整してください) –
これは同様に働いた: 'データテスト; 長さ$ 260; infile "cscript.exe C:\ temp \ GetFilePath.vbs"パイプfirstobs = 3; 入力パス$ 260 .; 実行; 'パスの長さはWindows 7の最大パス長なので260です。 –