Le service Applescript échoue à cause de contraintes manquantes


2

J'ai écrit un service Automator qui exécute un petit AppleScript pour régler le volume et jouer un son.

Pour activer le service, je l'ai copié dans /Library/Services et a fait un chmod +x. Pour enregistrer un raccourci clavier pour le service, j'ai exécuté defaults write -g NSUserKeyEquivalents '{"HelloWorld" = "$@~1";}'HelloWorld est le nom du service tel qu’il apparaît dans le menu Services et $@~1 mon raccourci (qui résout en + ⌥ + ⇧ + 1)

Après un redémarrage, je peux voir le service dans le menu avec le raccourci à côté. Lorsque j'appuie sur la combinaison de touches souhaitée, une alerte s'affiche pour signaler que le script a rencontré une erreur. Il apparaît également une erreur dans le journal:

Détection des contraintes manquantes pour. Il ne peut pas être placé car le nombre de contraintes est insuffisant pour définir complètement la taille et l'origine. Ajoutez les contraintes manquantes ou définissez translatesAutoresizingMaskIntoConstraints = YES et les contraintes seront générées pour vous. Si cette vue est présentée manuellement sur macOS 10.12 et versions ultérieures, vous pouvez choisir de ne pas appeler la [super présentation] à partir de votre substitution. Définissez un point d'arrêt sur DETECTED_MISSING_CONSTRAINTS pour le débogage. Cette erreur ne sera consignée qu'une fois.

Cela suggère une erreur avec une vue qui n'est pas initialisée correctement, mais je n'utilise aucune vue.

Voici le contenu du flux de travail Automator:

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

Je l'ai résolu. Vous ne pouvez pas échapper à des espaces dans do shell script arguments. J'ai dû mettre le nom du fichier entre guillemets (que vous pouvez échapper). Le message d'erreur est massivement trompeur!
K40S

Il est parfaitement acceptable d'écrire une réponse à votre propre question. Il est également préférable de l'insérer dans un commentaire. Après la période d’attente, vous pourrez alors accepter votre propre réponse pour renforcer votre réputation.
user3439894

Veuillez éditer votre question avec une note précisant que vos "espaces échappés" ne sont pas valides dans un argument de script shell @clemsamlang Je ne comprends pas ce que vous entendez par là, désolé.
K40S

Ce que je voulais dire, c'est que vous pourriez écrire un très court mot "[EDIT: J'ai trouvé la réponse, regardez ma réponse choisie.]" Au tout début de votre question. . . . (Je vais supprimer mon commentaire précédent car vous avez posté vos "résultats".) Merci et +1.
clemsam lang

Réponses:


1

Comme cela a été demandé dans les commentaires (désolé, cela a pris si longtemps), voici une version fonctionnelle du script. L'astuce consiste à mettre le nom de fichier (qui contient des espaces) entre guillemets, car ceux-ci peuvent être échappés.

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

1
Les espaces évacués sont parfaitement bien dans un do shell script commander , il suffit d’utiliser deux barres obliques inverses et non une lorsqu’on échappe à un espace do shell script commander , par exemple., do shell script "afplay /Library/Application\\ Support/HelloWorld/hello.mp3" fonctionnerait très bien!
user3439894
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.