Der Applescript-Dienst schlägt aufgrund fehlender Einschränkungen fehl

Ich habe einen Automator-Dienst geschrieben, der ein kleines Applescript ausführt, um die Lautstärke einzustellen und einen Ton abzuspielen.

Um den Dienst zu aktivieren, habe ich ihn in kopiert /Library/Servicesund eine chmod +x. Um eine Tastenkombination für den Dienst zu registrieren, habe ich ausgeführt, defaults write -g NSUserKeyEquivalents '{"HelloWorld" = "$@~1";}'wo HelloWorldder Name des Dienstes ist, wie er im Menü „Dienste“ und in $@~1meiner Tastenkombination zu sehen ist (was sich in ⌘+⌥+⇧+1 auflöst).

Nach einem Neustart sehe ich den Dienst im Menü mit der Verknüpfung daneben. Wenn ich die gewünschte Tastenkombination drücke, erscheint eine Warnung, die mir mitteilt, dass das Skript auf einen Fehler gestoßen ist. Im Log taucht auch ein Fehler auf:

Fehlende Einschränkungen für erkannt. Es kann nicht platziert werden, da es nicht genügend Beschränkungen gibt, um die Größe und den Ursprung vollständig zu definieren. Fügen Sie die fehlenden Einschränkungen hinzu oder setzen Sie translatesAutoresizingMaskIntoConstraints=YES und Einschränkungen werden für Sie generiert. Wenn diese Ansicht unter macOS 10.12 und höher manuell angelegt wird, können Sie sich dafür entscheiden, [Super-Layout] nicht von Ihrer Außerkraftsetzung aufzurufen. Setzen Sie einen Breakpoint auf DETECTED_MISSING_CONSTRAINTS zum Debuggen. Dieser Fehler wird nur einmal protokolliert.

Dies deutet auf einen Fehler bei einer Ansicht hin, die nicht korrekt initialisiert ist, aber ich verwende keine Ansichten.

Hier ist der Inhalt des Automator-Workflows:

on run

    if (get output volume of (get volume settings)) < 50 then
        set volume output volume 50
    end if

    do shell script "afplay /Library/Application\ Support/HelloWorld/hello.mp3"

    return
end run
Ich habe es gelöst. Sie können Leerzeichen in Argumenten nicht maskieren do shell script. Ich musste den Dateinamen in doppelte Anführungszeichen setzen (denen Sie entkommen können). Die Fehlermeldung ist massiv irreführend!
Es ist vollkommen akzeptabel, eine Antwort auf Ihre eigene Frage zu schreiben, und wird auch einem Kommentar vorgezogen. Sie könnten dann nach der Wartezeit Ihre eigene Antwort akzeptieren, um Ihren Ruf zu stärken.
Bitte BEARBEITEN Sie Ihre Frage mit einem Hinweis, dass Ihre "Escape-Leerzeichen" in einem Do-Shell-Skriptargument @clemsamlang nicht gültig sind. Ich verstehe nicht, was Sie damit meinen, tut mir leid.
Was ich meinte, ist, dass Sie direkt am Anfang Ihrer Frage ein sehr kurzes "[ EDIT: I found the answer, look at my selected answer. ]" schreiben könnten. . . . (Ich werde meinen vorherigen Kommentar löschen, da Sie jetzt Ihre "Ergebnisse" gepostet haben.) Danke und +1.

Antworten (1)

Da es in den Kommentaren angefordert wurde (sorry, dass es so lange gedauert hat), hier ist eine funktionierende Version des Skripts. Der Trick besteht darin, den Dateinamen (der Leerzeichen enthält) in doppelte Anführungszeichen zu setzen, da diese maskiert werden können.

on run

    if (get output volume of (get volume settings)) < 50 then
        set volume output volume 50
    end if

    do shell script "afplay \"/Library/Application Support/HelloWorld/hello.mp3\""

    return
end run
do shell script Leerzeichen mit Escapezeichen sind in einem Befehl vollkommen in Ordnung , Sie müssen nur zwei umgekehrte Schrägstriche verwenden, nicht einen, wenn Leerzeichen in einem do shell script Befehl mit Escapezeichen versehen sind , z. B. do shell script "afplay /Library/Application\\ Support/HelloWorld/hello.mp3"würde es gut funktionieren!