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.
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? –
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) –
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. –