2016-10-27 2 views
2

Ich habe ein SAS-Programm, das viele Eingabedateien erfordert, deren Namen jeden Monat variieren. Anstatt die einzelnen Dateinamen in Windows Explorer auf fest codierte Aliase in SAS zu aktualisieren oder die neuen Dateinamen in Makrovariablen zu kopieren und einzufügen, möchte ich, dass SAS eine Dateiaufforderung einleitet, in der ich die Eingaben auswählen kann. Ich verwende SAS 9.4 unter Windows 7.Lesen Sie den Rückgabewert von VBScript in SAS

Zu diesem Zweck habe ich ein VBScript geschrieben, das einen Dialog öffnet und entweder den Pfad einer ausgewählten Datei oder eine leere Zeichenfolge zurückgibt, wenn der Dialog abgebrochen oder geschlossen wird.

' 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() 

Idealerweise würde Ich mag den Rückgabewert von GetFilePath.vbs mit einer Makrovariable zuzuweisen. Mir ist jedoch nicht klar, wie ich das machen würde. Die einzige relevante Information, die ich gefunden habe, beschäftigt sich mit dem Lesen von I/O-Streams in einen Datensatz unter Verwendung eines unnamed pipe. Ich denke, wenn ich das kann, dann könnte ich zumindest CALL SYMPUT verwenden, um dann den Rückgabewert einer Makrovariablen zuzuordnen. Ich kann SAS jedoch nicht dazu bringen, den Rückgabewert zu lesen.

Ein Beispiel dessen, was ich habe, ist, versucht,

filename getfile pipe "C:\temp\GetFilePath.vbs"; 

data test; 
    infile getfile; 
    input path $; 
run; 

Die Eingabeaufforderung öffnet, aber der Rückgabewert path nicht zugeordnet ist.

Antwort

2

Ersetzen Sie einfach die letzte Zeile Ihrer VBScript-Datei wie folgt:

WScript.StdOut.Write GetFilePath() 

Und Ihre sas Code einstellen, wie so (keine Notwendigkeit, einen Dateinamen zu erklären):

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

Der 'Trick' war, die Ausgabe in STDOUT anstatt echo zu schreiben. Außerdem, wie dies answer, war die cscript.exe notwendig (für mich in Windows 2012) beim Aufruf der .vbs, um die Ausgabe in der Konsole zu halten - anstatt es als Fenster zurückspringen.

Übrigens, Kudos für einen gepflegten Ansatz. Ich hatte nicht gewusst, wie SAS auf diese Weise grafische Apps starten (und von ihnen zurücklesen) kann!

Hier ist das minimale Arbeitsbeispiel I für den Test verwendet:

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

Auf der Seite SAS:

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

Die gute Zeug! Wenn Sie einen Datensatz erstellen, werden Sie feststellen, dass zwei Beobachtungen eingefügt werden. Der erste ist ein Microsoft Disclaimer, der zweite der Dateipfad. Es scheint, als wäre '// NoLogo' die Option, den Haftungsausschluss zu deaktivieren. Wenn ich 'cscript.exe // NoLogo C: \ temp \ GetFilePath.vbs' in der Shell ausführe, erhalte ich tatsächlich nur den Dateipfad. Wenn ich jedoch dieselbe Anweisung in SAS versuche, werden keine Beobachtungen in den Datensatz geschrieben. Irgendwelche Ideen? –

+0

Nicht sicher über die '// NoLogo' Option, aber um diese ersten Zeilen in SAS zu ignorieren, fügen Sie einfach die folgende Zeile zu Ihrem Datastep hinzu: 'if _n _> = 4 dann Ausgabe;' (passen Sie die Nummer entsprechend) –

+0

Ich habe das gefunden das hat auch funktioniert: 'Datentest; Länge Pfad $ 260.; Infile "cscript.exe C: \ temp \ GetFilePath.vbs" Rohr firstobs = 3; Eingangspfad $ 260; laufen; 'Die Länge des Pfades ist 260, weil das die maximale Pfadlänge in Windows 7 ist. –

Verwandte Themen