Applescript aus der Menüleiste ausführen?

Ich kenne das Menü des Skripteditors. Das ist nicht das, wonach ich suche.

Gibt es eine Möglichkeit, ein Applescript über die Menüleiste auszuführen? Ich kann es als Datei speichern und über das Menü des Skripteditors ausführen, und ich kann es als Anwendung speichern und in mein Dock stecken. Gibt es ein Dateiformat, das es ermöglicht, es über die Menüleiste auszuführen, wie es viele Anwendungen tun? Oder eine Möglichkeit, den Code zu bearbeiten, der dasselbe tut?

Antworten (4)

Cocoa-AppleScript als Skript oder AppleScript-Anwendung, die im Skripteditor erstellt wurde, unterstützt die Menüleisten-App. Dieses Skript läuft auf macOS 10.12 (möglicherweise läuft es auf 10.10.x, 10.11.x). Dieses Skript kann als Anwendung gespeichert werden.

--AppleScript: menu bar script -- Created 2017-03-03 by Takaaki Naganoya
--2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
--http://piyocast.com/as/archives/4502

property aStatusItem : missing value

on run
    init() of me
end run

on init()
    set aList to {"Piyomaru", "Software", "", "Takaaki", "Naganoya", "", "Quit"}
    set aStatusItem to current application's NSStatusBar's systemStatusBar()'s statusItemWithLength:(current application's NSVariableStatusItemLength)

    aStatusItem's setTitle:"🚗"
    aStatusItem's setHighlightMode:true
    aStatusItem's setMenu:(createMenu(aList) of me)
end init

on createMenu(aList)
    set aMenu to current application's NSMenu's alloc()'s init()
    set aCount to 1
    repeat with i in aList
        set j to contents of i
        if j is not equal to "" then
            set aMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:j action:"actionHandler:" keyEquivalent:"")
        else
            set aMenuItem to (current application's NSMenuItem's separatorItem())
        end if
        (aMenuItem's setTarget:me)
        (aMenuItem's setTag:aCount)
        (aMenu's addItem:aMenuItem)
        if j is not equal to "" then
            set aCount to aCount + 1
        end if
    end repeat

    return aMenu
end createMenu

on actionHandler:sender
    set aTag to tag of sender as integer
    set aTitle to title of sender as string

    if aTitle is not equal to "Quit" then
        display dialog aTag as string
    else
        current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
    end if
end actionHandler:

Ich habe zuvor den von Piyomaru geposteten Originalcode bis zu dem Punkt bearbeitet, an dem er kompiliert werden kann, und wollte einige zusätzliche Informationen hinzufügen, um den Beispielcode für alle, die AppleScript relativ neu kennen, nützlicher zu machen.

Wenn der Beispielcode derzeit als Anwendung gespeichert ist , hat er keinen Code zum Beenden der Anwendung , er entfernt nur das Menüleistenobjekt. Fügen Sie also im Handler des Skripts Folgendes zum Zweig der Anweisung nach dem vorhandenen Code hinzu :actionHandler else if

        if (name of current application) is not "Script Editor" then
            tell current application to quit
        end if

Es ist so codiert, dass es nicht versucht, den Skripteditor zu schließen, wenn es vom Skripteditor aus ausgeführt wird. Sie können es ohne den if Anweisungsblock verwenden und nur verwenden, tell current application to quitwenn Sie es nicht im Skripteditor ausführen.

Da dieses Skript Cocoa-AppleScript verwendet, muss es nach der Ausführung im Skripteditor kurz vor dem Speichern erneut kompiliert werden, um die vom Cocoa-Applescript- Code erstellten C- und Objective-C-Zeiger zu leeren , da Zeiger nicht gespeichert werden können das Skript. Klicken Sie einfach auf das Hammer-Symbol in der Symbolleiste oder: Skripteditor > Skript > Kompilieren ⌘K

Darüber hinaus müssen Sie beim Speichern als Anwendung das Kontrollkästchen Nach Ausführungshandler geöffnet bleiben beim Speichern aktivieren, und standardmäßig wird die Dock-Kachel der App beim Ausführen im Dock angezeigt. Da dies ein unerwünschtes Verhalten für eine Menüleisten-App sein kann, verwenden Sie den folgenden Befehl im Terminal, um den erforderlichen Schlüssel zur Info.plist - Datei der App hinzuzufügen, damit er nicht im Dock angezeigt wird.

defaults write /Applications/name_of_app.app/Contents/Info.plist LSUIElement -bool yes
  • Ersetzen name_of_appSie ihn durch den tatsächlichen Namen, unter dem Sie ihn gespeichert haben, und ändern Sie gegebenenfalls den Pfad, wenn er nicht in /Applications.
  • Beachten Sie, dass, wenn Sie die App in das Dock ziehen, ihre Dock-Kachel immer noch im Dock angezeigt wird, aber wenn sie geöffnet ist, wird darunter kein Indikator für geöffnet angezeigt. Dieser zusätzliche Schlüssel zur Info.plist-Datei soll verhindern, dass die Dock-Kachel beim Ausführen im Dock angezeigt wird, wenn die App überhaupt nicht in das Dock gezogen wurde.

Im actionHandler Handler des ursprünglichen Beispielcodes wird nur ein Dialogfeld mit der Nummer des Menüelements angezeigt, auf das geklickt wurde, was für Beispielcode sicherlich in Ordnung ist . Ich möchte jedoch ein anderes Beispiel zeigen, auf dessen Grundlage separater Code ausgeführt wird welcher Menüpunkt angeklickt wurde. Der folgende Beispielcode könnte den gesamten Handler im ursprünglichen Skript ersetzen :actionHandler

on actionHandler:sender
    set aTitle to title of sender as string
    if aTitle is equal to "Quit" then
        current application's NSStatusBar's systemStatusBar()'s removeStatusItem:aStatusItem
        if (name of current application) is not "Script Editor" then
            tell current application to quit
        end if
    else if aTitle is equal to "Piyomaru" then

        --  # Your code to run for this menu choice goes here:

    else if aTitle is equal to "Software" then

        --  # Your code to run for this menu choice goes here:

    else if aTitle is equal to "Takaaki" then

        --  # Your code to run for this menu choice goes here:

    else if aTitle is equal to "Naganoya" then

        --  # Your code to run for this menu choice goes here:

    end if
end actionHandler:

Dies könnte jetzt anders geschrieben werden, dh "Beenden" als elseoder else ifganz unten, aber ich habe es so gemacht, weil ich möchte, dass alle anderen Menübefehle eine else ifAuswahl sind, obwohl logischerweise jeder andere gegebene Menübefehl eher angeklickt wird dann "beenden". Ich denke, es ist einfacher, den Code des Menübefehls hinzuzufügen / zu bearbeiten / zu entfernen, wenn er auf diese Weise geschrieben wird. Es ist nur eine persönliche Vorliebe, also tun Sie es so, wie Sie es für richtig halten.

Eine Diskussionsnotiz aus dem AppleScript Language Guide:

Eine if -Anweisung kann beliebig viele else if -Klauseln enthalten; AppleScript sucht nach dem ersten booleschen Ausdruck, der in einer if- oder else if - Klausel enthalten ist , die wahr ist , führt die in seinem Block enthaltenen Anweisungen aus (die Anweisungen zwischen einer else if- und der folgenden else if- oder else - Klausel) und beendet dann die if - Anweisung.

Eine if -Anweisung kann auch eine abschließende else - Klausel enthalten. Die Anweisungen in seinem Block werden ausgeführt, wenn kein anderer Test in der if - Anweisung bestanden wird.

Für den größten Teil des ursprünglichen Beispielcodes sollten Sie nur zwei Codezeilen im init Handler ändern müssen :

set aList to {"Piyomaru", "Software", "", "Takaaki", "Naganoya", "", "Quit"}
  • Dies legt den Namen der Menübefehle in ihrer Reihenfolge fest und ""dient als Trennzeichen.

Für ein anderes Symbol:

aStatusItem's setTitle:"🚗"
  • Ändern Sie das "🚗" in etwas anderes, das Sie bevorzugen, von: Skripteditor > Bearbeiten > Emoji & Symbole

Hoffentlich ist es offensichtlich, dass der ifAnweisungsblock im Handler dem im actionHandler Handler entspricht , also stimmen Sie die Namen im im Handler mit den Namen im im Handler ab .aListinit aTitle is equal toactionHandler aListinit

Der Rest des Codes sollte nicht geändert werden müssen, kann es aber bei Bedarf oder Wunsch sicherlich.

Ich habe Ihre Antwort bearbeitet, da sie so, wie sie geschrieben wurde, nicht kompiliert werden würde, sie sollte es jetzt tun. Außerdem verwendet dieses Skript Cocoa-AppleScript, nicht nur normales oder standardmäßiges AppleScript. +1 obwohl.
Ich kann es nicht speichern - weder als Skript noch als Anwendung. Ich habe den Kompilierungsschritt durchgeführt, bekomme aber immer wieder: Das Dokument "xxx" konnte nicht automatisch gespeichert werden. C- und Objective-C-Zeiger können nicht in Skripten gespeichert werden. Was mache ich falsch?
AppleScript-Dokumentdatei kann keine C- und Objective-C-Zeiger darin speichern. Sie müssen also AppleScript bearbeiten (z. B. Leerzeilen hinzufügen oder Leerzeilen löschen), dann können Sie es speichern. Dies ist ein normaler Vorgang für den Original-Skripteditor von Apple.
Mein Beitrag wird zu sehr von anderen Moderatoren ohne Kenntnis des neuesten AppleScript bearbeitet. Die aktuelle Version enthält viele Missverständnisse und ist nicht korrekt. Also zeige ich die Links zu meinen Artikeln in meinem Blog. Es klappt. piyocast.com/as/archives/996 piyocast.com/as/archives/1700 piyocast.com/as/archives/1851

Normales AppleScript als Skript oder im Skripteditor erstellte AppleScript-Anwendung wird nicht als Menüleisten-App unterstützt. Sie müssten Cocoa-AppleScript verwenden oder eine App in Xcode erstellen (oder einen Launcher eines Drittanbieters verwenden), wenn Sie das Skriptmenü in der Menüleiste nicht verwenden möchten.

Hier ist eine Beispiel-App, die in Xcode mit Swift erstellt wurde: WeatherBar .

Eine seit langem vertrauenswürdige App, die dies tut, ist FastScripts , und obwohl es wie das Skriptmenü aussieht, bietet es zusätzliche Funktionen. Es kann als kostenlose App mit bis zu 10 Tastenkombinationen ausgeführt oder für 9,95 $ aktualisiert werden, um unbegrenzte Tastenkombinationen freizuschalten.

Ich habe keine Verbindung zu Red Sweater Software, LLC, außer als Benutzer von FastScripts als kostenlose App.

FastScripts ist insofern nett, als Sie Tastenkombinationen für Ihre Menüelemente zuweisen können. Apples „Skript-Editor-Menü“ hat es vor Jahren aufgehört, Verknüpfungen zu seinen Menüelementen zuzuweisen,

Je nachdem, was genau Sie mit Ihrem Apple-Skript machen möchten, könnte vielleicht xbar / swiftbar für Ihren Zweck geeignet sein.

Im Allgemeinen können Sie mit diesen Anwendungen die Ausgabe einer Vielzahl von Skripten in der Menüleiste anzeigen - viele Skripte sind bereits verfügbar, aber Sie können auch Ihre eigenen schreiben.

Sie können auch zur Ausführung verwendet werden applescripts. applescriptIch verwende sie zum Beispiel, um ein gespeichertes als auszuführen , serviceindem ich es über ein kleines Bash-Skript aufrufe:

#!/bin/bash
echo "blub"
echo "---"
echo "1 | bash=/Users/username/Library/Services/Space_1 terminal=false"

Es gibt ein wenig genutztes "Dienste"-Menü (im Menü unter dem Namen der Anwendung) und Sie können Skripte als Dienste speichern und sie im Dienste-Menü entweder für eine bestimmte Anwendung verfügbar machen.

Es gibt auch das Konzept von Anwendungen, die "anfügbar" sind. Diese Anwendungen ermöglichen es Ihnen, Skripts zu den eigenen Menübefehlen der Anwendung hinzuzufügen. Aber Anwendungen, die anschließbar sind, scheinen selten zu sein.

Passt etwas davon zu dem, was Sie suchen?

Nö. Ich suche nach einer Anwendung, die über die Menüleiste selbst ausgeführt wird, nicht nach einem Dienst. Hast du die Speedtest-App? So etwas in der Art, wo sich die App selbst in der Menüleiste befindet und nicht nur von dort aus gestartet wird.