4 votes

L'AppleScript do shell ne fonctionne pas sur le répertoire Application Support

J'ai passé la journée à faire plusieurs recherches et tentatives sur la façon de copier un fichier situé dans une application AppleScript dans le répertoire Root Application Support ( hdd -> Library -> Application Support ). Au départ, je pensais qu'il s'agissait d'un problème d'appel. do shell script y administrator privileges mais pour une raison quelconque, si j'ai un fichier situé dans une application AppleScript, j'essaie d'appeler ce fichier pour qu'il soit ajouté au support d'application, par exemple :

set foo to "Macintosh HD/Users/vader/someapp.app/Contents/Resources/Scripts/foobar.txt"
set bar to "Macintosh HD/Library/Application Support/"

do shell script "cp " & (quoted form of foo) & space & (quoted form of bar) with administrator privileges

Je l'ai réduit à la forme de base en ce qui concerne le chemin d'accès au dossier et au fichier, mais lorsque j'exécute la commande ci-dessus, j'obtiens un message d'erreur :

cp : Macintosh HD/Users/vader/someapp.app/Contents/Resources/scripts/foobar.txt : Non tel fichier ou répertoire

Je peux retourner vrai que le fichier existe dans l'application avec :

set foobar to POSIX path of (path to resource "foobar.txt" in directory "Scripts")
if not (exists foobar) then
    return false
else
    return true
end if

J'ai essayé avec :

tell application "Finder" to duplicate file (foo) to folder (bar)

mais ça n'a pas marché non plus.

Recherche lorsque j'ai essayé de supprimer le fichier après l'avoir ajouté manuellement (oui, j'ai des droits d'administrateur sur ma boîte) :

J'ai fait des recherches dans plusieurs domaines pour voir comment mettre en œuvre la demande d'autorisations à l'aide de administrator privileges mais sans succès :

Voici les tentatives suivantes que j'ai essayées :

Événements système AppleScript :

tell application "System Events" to delete file appWithPath

faire des tentatives d'obus :

tentative 1

do shell script "rm -f " & appNamewithQuotedFormPath with administrator privileges

tentative 2

do shell script "find " & quotedPathToDirectory & " -name \"" & applicationName & "\" -type f -delete" with administrator privileges

Ça ne marchait toujours pas et j'ai vérifié avec :

do shell script "echo " & appNamewithQuotedFormPath with administrator privileges

Après avoir creusé dans l'éditeur de script, j'ai découvert que j'obtenais -10004 error alors j'ai fait des recherches :

J'ai donc déplacé l'ajout et la suppression du fichier dans Application Support vers un gestionnaire qui n'avait pas de bloc try, mais toujours rien.

Pensant que cela pouvait être un problème avec les privilèges utilisés, j'ai essayé tous les paramètres suivants utilisés avec Scripting Additions :

enter image description here

Dans une application AppleScript, comment puis-je ajouter y supprimer un fichier qui existe dans l'application vers le répertoire racine du support de l'application ?


EDITAR:

Après d'autres tests, j'ai supprimé l'utilisation de Macintosh HD y el do shell script fonctionnerait, mais je ne comprends pas pourquoi cela ferait échouer le script. Pourquoi l'ajout de Macintosh HD au chemin provoque l'erreur du script ?

2voto

user3439894 Points 52496

Si vous utilisez le code en dur, sans vérifier si le fichier existe, utilisez l'exemple suivant :

set foo to quoted form of "/Users/vader/someapp.app/Contents/Resources/Scripts/foobar.txt"
set bar to quoted form of "/Library/Application Support/"
try
    do shell script "cp " & foo & space & bar with administrator privileges
end try

Si vous l'appelez à partir du script dans le paquet d'applications, utilisez l'exemple suivant :

on run
    try
        set foo to POSIX path of (path to me as string) & "Contents/Resources/Scripts/foobar.txt"
        set bar to quoted form of "/Library/Application Support/"

        tell application "System Events"
            if exists file foo then
                tell current application
                    do shell script "cp " & quoted form of foo & space & bar with administrator privileges
                end tell
            end if
        end tell
    on error eStr number eNum
        display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with icon caution
        return
    end try
end run

Note : Lorsque vous travaillez avec le do shell script commande Les noms de chemin POSIX doivent être utilisés, et non les alias. Macintosh HD n'est pas valable dans un POSIX path mais seulement dans un alias. Dans un POSIX path de la startup disk tout commence dans le Racine de la volume : /

Exemple :

tell application "Finder" to get name of startup disk as alias
tell application "Finder" to get POSIX path of (name of startup disk as alias)

Les retours :

Macintosh HD 
/

1voto

Gordon Davisson Points 30215

@user3439894 a déjà expliqué comment résoudre le problème ; j'aimerais tenter d'expliquer pourquoi la confusion existe. Cela vient du fait que le système d'exploitation Macintosh n'a pas toujours été basé sur unix (/POSIX). Avant OS X (qui est basé sur unix), Mac OS était un système d'exploitation complètement différent avec sa propre notation des chemins de fichiers. Lorsque OS X est sorti, il a dû prendre en charge à la fois les API d'accès aux fichiers d'Unix (qui utilisaient la notation de chemin d'accès d'Unix) et les API traditionnelles de Mac OS (qui utilisaient la notation de chemin d'accès traditionnelle de Mac OS). Au fil des ans, OS X (/MacOS) a déprécié certaines des API traditionnelles de Mac OS et s'est orienté de plus en plus vers la notation de chemin unix pure. Mais AppleScript est une exception : il est antérieur à OS X, il utilise donc nativement l'ancienne notation traditionnelle de Mac OS.

Voici un résumé des différences :

  • Les chemins d'accès Unix (/POSIX) utilisent "/" comme délimiteurs (et autorisent " :" dans les noms de fichiers), tandis que les chemins d'accès Mac OS utilisent " :" comme délimiteurs (et autorisent "/" dans les noms de fichiers).
  • Les chemins Unix sont absolus s'ils commencent par le délimiteur ("/") ; les chemins Mac OS sont absolus s'ils ne pas commencent par le délimiteur (" :").
  • Les chemins absolus Mac OS commencent par le nom du volume, tandis que les chemins absolus Unix commencent au sommet du volume racine, et les autres volumes apparaissent comme des dossiers quelque part en dessous.

Voici quelques exemples :

Mac OS: Macintosh HD:Users:vader:someapp.app:Contents:Resources:Scripts:foobar.txt
Unix: /Users/vader/someapp.app/Contents/Resources/Scripts/foobar.txt

Mac OS: Other disk:daily notes:7/19/2017 meeting.rtf
Unix: /Volumes/Other disk/daily notes/7:19:2017 meeting.rtf

Mac OS: :Documents:file.txt
Unix: Documents/file.txt

En AppleScript, vous pouvez utiliser POSIX path of y as alias pour les convertir.

-2voto

Dickster Points 153

Votre script original spécifiait "cp Macintosh HD ...", mais utilisez /Volumes/Macintosh\ HD ... à la place. De plus, il est préférable de mettre une barre oblique inverse avant tout blanc, comme je l'ai fait ci-dessus avant HD. Cela s'applique également à l'option "Application - Support".

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X