Gibt es eine Möglichkeit, die AppleScript-Ausgabe in der Menüleiste anzuzeigen?

Bevor Sie weiterlesen: Ich kenne Butler und ähnliche Programme. Ich suche nach einer EINGEBAUTEN Möglichkeit, dies ohne eine Drittanbieter-App zu tun.

Wie auch immer, ich habe ein AppleScript geschrieben, das einen Shell-Befehl ausführt. Ich möchte diese Ausgabe in der Menüleiste oben anzeigen ... ohne Butler, wie kann ich das tun?

Da AppleScriptObjC Teil von macOS (2014) ist, ist es möglich, sein „Foundation“-Framework (einschließlich der Methoden von NSMenu) zu verwenden, um das zu erreichen, was 2012 wahrscheinlich nicht möglich war. . . . . . Siehe meine Antwort unten auf How-to-do-it !

Antworten (3)

Im Allgemeinen gibt es ohne ein Drittanbieterprogramm wie Growl keine eingebaute Möglichkeit, dies zu tun.

Sie könnten jedoch ein Skript oder ein anderes Programm schreiben, wie eines, das ich hier gefunden habe , das den Menulet-Dienst für Sie bereitstellt. Ich bin mir sicher, dass die Growl-Integration viel einfacher zu bewerkstelligen wäre.

In OS X gibt es dafür keine integrierte Möglichkeit. Mit Growl können Sie jedoch Benachrichtigungen erhalten. Hier ist ein Beispielskript dafür:

--Make sure Growl is running
tell application "System Events"
    set isRunning to (count of (every process whose bundle identifier is "com.Growl.GrowlHelperApp")) > 0
end tell

if isRunning then
    tell application id "com.Growl.GrowlHelperApp"
        set the allNotificationsList to ¬
            {"Test Notification", "Another Test Notification"}
        --Notifications can be enabled in System Preferences>Growl>Applications>Display Options
        set the enabledNotificationsList to ¬
            {"Test Notification"}
        register as application ¬
            "Growl AppleScript Sample" all notifications allNotificationsList ¬
            default notifications enabledNotificationsList ¬
                    -- Set the icon. You can use any icon from any application
            icon of application "AppleScript Editor"

        notify with name ¬
            "Test Notification" title ¬
            "Test Notification" description ¬
            "This is a test AppleScript notification." application name "Growl AppleScript Sample"

        notify with name ¬
            "Another Test Notification" title ¬
            "Another Test Notification :) " description ¬
            "Alas — you won't see me until you enable me..." application name "Growl AppleScript Sample"

    end tell
end if

Das sollte dies anzeigen:

Und wenn Sie auch die andere Benachrichtigung aktiviert haben:

Fortgeschrittenere Techniken werden hier beschrieben.

Da AppleScriptObjC Teil von macOS ist, ist es möglich, sein "Foundation"-Framework (einschließlich der Methoden von NSMenu) zu verwenden, um das zu erreichen, was 2012 wahrscheinlich nicht möglich war.

Ich habe ein interessantes Skript gefunden, um benutzerdefinierte Menüs in AppleScript zu erstellen; Daraus habe ich geeigneten Code extrahiert, um Text in der Menüleiste von macOS zu platzieren . Tatsächlich verwendet es nur den "Titel" eines Menüs zum Einfügen von Inhalten.

Um dies zu demonstrieren, habe ich ein sehr einfaches Dialogskript implementiert, das Benutzer zur Texteingabe auffordert (6 Sek. Wartezeit), die dann vorübergehend (5 Sek.) in der Menüleiste angezeigt wird.
Hier ist es:

use framework "Foundation"
use framework "AppKit"
use scripting additions
property StatusItem : missing value
property newMenu : class "NSMenu"

display dialog "Write something:" default answer "" giving up after 6
set myText to text returned of the result
if myText is "" then set myText to "TOOOOO slow … try again !"
set myText to ">>    " & myText & "    <<"

set bar to current application's NSStatusBar's systemStatusBar
set StatusItem to bar's statusItemWithLength:-1.0
StatusItem's setTitle:myText
set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"
StatusItem's setMenu:newMenu

delay 5
current application's NSStatusBar's systemStatusBar()'s ¬
        removeStatusItem:StatusItem  

Dieser AppleScript-Code kann in jedem Ihrer Skripts verwendet werden. (Der „Dialog“-Teil ist optional…)

user3439894 half beim Schließen meines "Menüs", siehe letzte Zeile des Skripts. Vielen Dank!

Haben Sie zufällig einen Link zum ursprünglichen Quellcode, aus dem Sie Ihre Antwort abgeleitet haben? Es wäre schön zu sehen. Danke.
Ja – es ist im letzten Handler der akzeptierten Antwort auf diese Frage: https://stackoverflow.com/questions/29168474/creating-a-simple-menubar-app-using-applescript. . . . . Ich fürchte allerdings, dass meine letzte Zeile (funktioniert die Hälfte der Zeit), die ich woanders gefunden – und angepasst – NICHT korrekt ist . . . . . . Ich bin kein Programmierer, also brauche ich etwas mehr Zeit, um Code zu verstehen.
BTW Es ist eine nette Antwort und wenn nicht für "es ist ein paar Mal abgestürzt – wegen "dealloc()" ?" Ich hätte +1. Einige Denkanstöße ... wenn Sie diesen Code als eigenständige AppleScriptObjC-App verwenden, wäre das vielleicht besser, dann StatusItem's dealloc()gilt er nur für die AppleScriptObjC-App und nicht für den Skripteditor und stürzt ihn versehentlich ab.
FWIW Die erste set myText to ...Codezeile , die vor dem Befehl , macht wirklich nichts basierend auf dem nachfolgenden Code und wird daher überhaupt nicht benötigt. Mit anderen Worten, der einzige verwendete Wert von ist derjenige, der zugewiesen wird, nachdem der Befehl ausgeführt wurde, und warum das Setzen auf irgendetwas vor dem Befehl eine unbenutzte Codierung ist und im Kontext des aktuell präsentierten Codes nicht erforderlich ist.display dialog myTextdisplay dialog display dialog
Anstelle von StatusItem's dealloc()oder StatusItem's setTitle:""würde ich verwenden:current application's NSStatusBar's systemStatusBar()'s removeStatusItem:StatusItem
Zurückgegeben: error "NSWindow drag regions should only be invalidated on the Main Thread!" number -10000.