Ich habe einen sehr seltsamen Fehler bei Services entdeckt.
Um dieses Verhalten zu beobachten, gehen Sie bitte wie folgt vor:
Stellen Sie sicher, dass sich Safari in Ihrem Dock befindet.
Automator öffnen. Erstellen Sie einen neuen Dienst.
Stellen Sie den Dienst so ein, dass er in „jeder Anwendung“ „keine Eingabe“ erhält.
Fügen Sie eine Aktion "AppleScript ausführen" ein.
Fügen Sie Folgendes in die Aktion ein:
on run {input, parameters}
delay 5
display dialog "Hello"
tell application "Safari" to activate
return input
end run
Speichern Sie den Dienst.
Schließen Sie den Dienst.
Öffnen Sie den Dienst erneut.
Automator sollte Ihnen ein Dialogfeld mit der Frage anzeigen: „Möchten Sie den Dienst „ServiceName“ installieren?“ Klicken Sie auf „Installieren“.
Wenn das Dialogfeld „Installation abgeschlossen“ angezeigt wird, klicken Sie auf „Fertig“.
Führen Sie nun den Dienst aus. Klicken Sie dazu auf den Titel der aktuellen Anwendung in der oberen linken Ecke des Bildschirms (der zweite Punkt in der Menüleiste). Klicken Sie dann auf den Diensttitel.
Sie werden feststellen, dass Safari sofort geöffnet wird (erkennbar am schwarzen Punkt unter seinem Logo im Dock). Safari wird vor der 5-Sekunden-Verzögerung und vor der Anzeige des „Hallo“-Dialogs geöffnet.
Das Platzieren der activate
Anweisung in einer Subroutine behebt das Problem nicht.
Kann jemand bestätigen, dass das ein Bug ist? Ich bin davon überzeugt, dass dies ein Fehler in der Dienstfunktion ist, denn wenn Sie den Dienst in Automator ausführen (indem Sie auf die Schaltfläche „Play“ in der oberen rechten Ecke des Automator-Fensters klicken), wird der Code korrekt ausgeführt.
Wenn dies ein Fehler ist, hat jemand eine Problemumgehung, damit die Anwendung tatsächlich nicht geöffnet wird, bevor der vorherige Code ausgeführt wird?
Auf meinem Macbook Pro läuft OS X El Capitan, 10.11.6.
Der Fehler könnte mit einem anderen seltsamen Verhalten zusammenhängen, das mir aufgefallen ist:
Beenden Sie Safari.app und Automator.app, falls sie ausgeführt werden.
Rufen Sie im Finder den Ordner auf, in dem die Dienste des Computers gespeichert sind (/Users/Me/Library/Services/).
Klicken Sie mit der rechten Maustaste auf die Service-Datei und öffnen Sie die Datei mit Automator.
Sie werden feststellen, dass das Öffnen der .workflow-Datei mit Automator Safari aktiviert. Das sollte es nicht tun.
Die einzige Problemumgehung, die ich nach dem Testen verschiedener Szenarien gefunden habe, besteht darin, die Safari- Befehle in einen do shell script
Befehl einzuschließen , z do shell script "osascript -e 'tell application \"Safari\" to activate'"
. Beachten Sie, dass mit osascript
mehrere −e
Optionen angegeben werden können, um ein mehrzeiliges Skript aufzubauen.
Aus der Handbuchseite für osascript
:
−e- Anweisung
Geben Sie eine Zeile eines Skripts ein. Wenn −e angegeben ist, sucht osascript nicht nach einem Dateinamen in der Argumentliste. Es können mehrere −e- Optionen angegeben werden, um ein mehrzeiliges Skript aufzubauen. Da die meisten Skripte Sonderzeichen für viele Shell-Programme verwenden (z. B. verwendet AppleScript einfache und doppelte Anführungszeichen, „(“, „)“ und „*“), muss die Anweisung korrekt in Anführungszeichen gesetzt und mit Escapezeichen versehen werden, um sie zu erhalten vorbei an der Schale intakt.
Beispiel AppleScript -Code :
tell application "Safari"
activate
make new document in front
set URL of front document to "http://apple.stackexchange.com/questions/271133/services-bug-that-prematurely-activates-an-application"
end tell
Ein Beispiel für den obigen AppleScript- Code , geschrieben als do shell script
Befehl mit osascript
der -e
Option , falls erforderlich.
do shell script "osascript -e 'tell application \"Safari\"' -e 'activate' -e 'make new document in front' -e 'set URL of front document to \"http://apple.stackexchange.com/questions/271133/services-bug-that-prematurely-activates-an-application\"' -e 'end tell'"
Wie Sie sehen können, ist jede Zeile des AppleScript- Codes aus der normalen tell
Blockanweisung ihre eigene -e
Option , und wie in der Handbuchseite für osascript
die -e
Option angegeben , wurde bei Bedarf mit einem Backslash maskiert, damit der Code vor der Ausführung korrekt kompiliert wird .
Mit anderen Worten, dies verwandelt die normale tell
Blockanweisung und die darin enthaltenen Befehle in einen einzeiligen do shell script
Befehl , um den offensichtlichen Fehler in dem im OP vorgestellten Anwendungsfall-Szenario zu umgehen.
Beachten Sie, dass Sie in der Lage sein sollten, ähnliches mit anderen Anwendungen zu tun, die durch denselben Fehler ausgelöst werden, indem Sie den entsprechenden Anwendungsnamen ( und Befehle ) nach Bedarf ersetzen.
Benutzer3439894
Rubiks Sphäre
Benutzer3439894
do shell script
, zdo shell script "osascript -e 'tell application \"Safari\" to activate'"
. Beachten Sie, dass mitosascript
mehrere −e-Optionen angegeben werden können, um ein mehrzeiliges Skript aufzubauen.Rubiks Sphäre
KugelschreiberBen
tell application "Whatever" to ...
diese App aktiviert. Das ist wahrscheinlich die zugrunde liegende Ursache.