2017-08-23 1 views
1

Ich bin es leid, manuell zum aktuellen Arbeitsordner zu navigieren und möchte einen Hotkey in SAS erstellen, um mich dorthin zu bringen. Ich habe einen Befehl entworfen, um den aktuellen Ordner von SAS aus zu öffnen. Ich kann es jedoch nicht über einen Hotkey ausführen lassen.SAS - Fehler beim Aufruf des Makros von Hotkey (CWD innerhalb von SAS öffnen)

ich geschaffen habe (stolen) das Makro:

%macro GetPwd(); 
    %qsubstr(
     %sysget(SAS_EXECFILEPATH) 
    , 1 
    , %length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME)) 
) 
%mend; 

Ich habe die oben als GetPwd.sas in meiner Autocall-Bibliothek gespeichert.

Im interaktiven Modus kann ich dann folgendes zu öffnen Windows Explorer auf die aktuellen SAS Arbeitsordner verwenden:

/*The Call:*/ 
%sysexec(start explorer.exe "%GetPwd()" && exit); 

Das Problem entsteht, wenn ich den oben Aufruf im KEYS Menü platzieren.

enter image description here

Als ich den Anruf über den Hotkey Ausgabe (SHF F9), öffnet Windows Explorer "Computer" auf und ich erhalte den folgenden Fehler in SAS:

WARNING: Argument 2 to macro function %QSUBSTR is out of range. 
WARNING: Argument 3 to macro function %QSUBSTR is out of range. 

Warum dieser Fehler auftreten, wenn Der Anruf wird von einem Hotkey ausgegeben und nicht bei der Übergabe über den Editor?


Ich habe Erfolg mit der ähnlichen Aufgabe hatte die SAS temporäre Ordner zu öffnen mit: oben

%sysexec(start explorer.exe "%sysfunc(pathname(work))" && exit); 

Siehe F9 im KEYS Menübild.

+1

Ich habe gerade keinen Zugriff auf SAS, also kann ich es nicht testen, aber ich würde versuchen, den Aufruf '% sysexec' direkt in die Makroroutine zu setzen und sie der Verknüpfung zuzuordnen, z. 'submit '% OpenPwd;'' –

+1

http://support.sas.com/kb/36/613.html – user2877959

Antwort

1

Wie von @ user2877959 angezeigt, scheint es, dass eine direkte Lösung nicht möglich ist. Hier beschreibe ich, was ich für die zweitbeste Lösung halte. Es erfordert einen Trick, den ich ein "Abkürzungsmakro" nenne, das die Macht von keyboard macros und SAS Abbreviations kombiniert. Dies setzt voraus, dass der erweiterte Editor verwendet wird.

  1. eine Abkürzung hinzu, indem Sie auf Tools > Add Abbreviation...
  2. In der "Abkürzung" Feld \pwd setzen würde. Geben Sie für "Text für Abkürzung einfügen" den Anruf ein %sysexec(start explorer.exe "%GetPwd()" && exit);

Hier wird der Trick angezeigt.

  1. Navigieren Sie zu Tools > Keyboard Macros > Macros.... Beachten Sie, dass \pwd jetzt in der Liste angezeigt wird. Dies bedeutet, dass \pwd nicht nur als Abkürzung fungieren kann, d. H. Eine Abkürzung für ein Code-Snippet, sondern auch als Auslöser für eine Sequenz von Tastaturmakrobefehlen dienen kann.
  2. Wählen Sie den Eintrag für \pwd und wählen Sie "Bearbeiten". Ordnen Sie unter den verfügbaren Befehlen "Tastaturmakroinhalt:" zu und drücken Sie "OK".

Move cursor to end of line 
Insert carriage return 
Insert the string "%sysexec(start explorer..." 
Extend selection to beginning of line 

Wenn nun die \pwd Abkürzung verwendet wird, wird der Anruf auf der nächsten Zeile platziert und automatisch markiert. Die Abkürzung kann überall ausgegeben werden, auch in der Mitte einer Codezeile, und wird nicht stören, was bereits geschrieben wurde. Um die Zeile zu entfernen, erstellen Sie ein Tastaturmakro für "Zeile löschen". Dies wird die Zeile entfernen, die von \pwd erstellt wurde und den Quellcode in seinen ursprünglichen Zustand zurückgeben.

1

Wie Benutzer2877959 in Kommentaren angibt, sind SAS_EXECFILEPATH und SAS_EXECFILENAME nicht verfügbar, außer wenn Sie sich in einem bereits gespeicherten Programm befinden. Daher sind sie nicht verfügbar, sie haben keinen Wert. Insbesondere sind sie in der KEYS-Umgebung niemals verfügbar (da diese nicht in einer Datei gespeichert sind!). Sie können dies sehen, indem Sie Ihren Code in einem neuen Editorfenster ausführen, das noch nicht gespeichert wurde.

Sie können ein Tastaturmakro verwenden, um mehr oder weniger zu erreichen, was Sie wollen; weisen Sie denselben Text einem Tastaturmakro zu, und es wird dann den Code setzen, um Ihr Programm in dem aktuellen Editorfenster aufzurufen, das Sie dann ausführen und optional löschen können. (Sie könnten es sogar in einen /* */ Block einbetten, damit es nicht gelöscht werden muss).

Alternativ können Sie Ihre Programme immer das aktuelle Arbeitsverzeichnis in ein eigenes Verzeichnis am Anfang des Programms ändern (Sie senden einen Befehl mit dem gleichen Pfad), die Sie dann den Explorer öffnen und haben können es fängt am richtigen Ort an; oder (abhängig davon, wie Sie SAS starten), können Sie festlegen, dass SAS mit dem richtigen Verzeichnis gestartet wird (in der Verknüpfung). Das ist nur dann wirklich nützlich, wenn Sie nur wenige Stellen haben, an denen es gestartet werden muss.