2016-10-27 60 views
2

毎月の名前が異なる多くの入力ファイルを必要とする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

ただ、次のようにVBScriptファイルの最後の行を置き換える:「トリック」を

data test; 
    infile "cscript.exe C:\temp\GetFilePath.vbs" pipe; 
    input path:$100.; /* adjust length as appropriate */ 
run; 

WScript.StdOut.Write GetFilePath() 

をそしてそう(ファイル名を宣言する必要はありません)のようなあなたのSASコードを調整エコーではなくSTDOUTに出力を書き込むことでした。さらに、このanswerのように、.vbsを呼び出すときにはcscript.exeが必要でした(Windows 2012の場合は私にとって)。ウィンドウとして戻すのではなく、コンソールに出力を保存します。

ところで、丁寧なアプローチのための名声。 SASがこのような方法でグラフィカルアプリケーションを起動(および読み戻し)するためにどのように使用されるのか、私は感謝していませんでした。 SAS側で

' GetFilePath.vbs 
Option Explicit 
Function GetFilePath() 
    GetFilePath = InputBox("Provide a value for SAS") 
End Function 
WScript.StdOut.Write GetFilePath() 

:良いものだ

data _null_; 
    infile "cscript.exe C:\Temp\aaa.vbs" pipe; 
    input; putlog _infile_; 
run; 
+0

は、ここで私はテストのために使用され、最小限の作業例です!データセットを作成すると、2つの観測結果が得られます。最初はMicrosoftの免責条項、2番目はファイルパスです。免責条項をオフにするオプションは '// NoLogo'のようです。シェルで 'cscript.exe // NoLogo C:\ temp \ GetFilePath.vbs'を実行すると、実際にはファイルパスだけが取得されます。しかし、SASで同じステートメントを試すと、データセットには何の観測も書き込まれません。何か案は? –

+0

'/ NoLogo'オプションについてはわかりませんが、SASの最初の行を無視するだけで、datastepに次の行を追加してください:' _n _> = 4 then output; '(適切な数を調整してください) –

+0

これは同様に働いた: 'データテスト; 長さ$ 260; infile "cscript.exe C:\ temp \ GetFilePath.vbs"パイプfirstobs = 3; 入力パス$ 260 .; 実行; 'パスの長さはWindows 7の最大パス長なので260です。 –

関連する問題