AppleScript ne shell ne fonctionnera pas sur le répertoire de support d'application

4

J'ai passé la journée à effectuer plusieurs recherches et à tenter de copier un fichier situé dans une application AppleScript dans le répertoire racine Application Support ( hdd -> Library -> Application Support ). A l'origine, je pensais que c'était un problème d'appeler do shell script et 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é à Application Support, 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

J'ai pris ceci dans le formulaire de base en ce qui concerne le chemin du dossier et le chemin du fichier, mais lorsque j'exécute ce qui précède, un message d'erreur de:

cp: Macintosh   HD / Utilisateurs / vader / someapp.app / Sommaire / Ressources / 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é cela avec:

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

mais cela n'a pas fonctionné non plus.

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

J'ai étudié plusieurs domaines pour savoir comment implémenter l'invite des autorisations à l'aide de administrator privileges mais sans chance:

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 de shell:

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

Cela ne fonctionnait toujours pas et j'ai vérifié avec:

do shell script "echo " & appNamewithQuotedFormPath with administrator privileges

Après avoir fouillé dans l'éditeur de script, j'ai découvert -10004 error alors j'ai cherché:

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 pourrait ê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 et retirer un fichier existant dans l'application dans le répertoire racine Application Support?


MODIFIER:

Après d’autres tests, j’ai supprimé l’utilisation de Macintosh HD et le do shell script fonctionnerait ce que je ne comprends pas pourquoi cela ferait échouer le script. Pourquoi ajouter Macintosh HD au chemin cause-t-il une erreur au script?

ʀ2ᴅ2
la source

Réponses:

2

Si vous codez 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 de l'ensemble 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

Remarque: Lorsque vous travaillez avec do shell script commander , Les noms de chemin POSIX doivent être utilisés, pas les alias. Macintosh HD n'est pas valable dans un POSIX path, juste dans un alias. Dans un POSIX path du startup disk, tout commence dans le racine du le 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)

Résultats:

Macintosh HD 
/
user3439894
la source
1

@ user3439894 a déjà expliqué comment résoudre le problème. Je voudrais essayer d'expliquer pourquoi la confusion existe. Cela remonte au fait que le système d'exploitation Macintosh n'était pas toujours 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 de chemin de fichier. Lorsque OS X est sorti, il devait prendre en charge à la fois les API d'accès aux fichiers Unix (qui utilisaient la notation de chemin d'accès Unix) et les API Mac OS traditionnelles (qui utilisaient la notation de chemin d'accès Mac OS traditionnelle). Au fil des ans, OS X (/ macOS) a déconseillé l’application de certaines API traditionnelles de Mac OS et s’intéresse de plus en plus à la notation de chemin unix pure. AppleScript est une exception: il est antérieur à OS X et utilise donc de manière native l’ancienne notation Mac OS traditionnelle.

Voici un résumé des différences:

  • Les chemins Unix (/ POSIX) utilisent "/" comme délimiteurs (et autorisent ":" dans les noms de fichiers), tandis que les chemins 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 commencez par le délimiteur (":").
  • Les chemins absolus de Mac OS commencent par le nom du volume, tandis que les chemins unix absolus commencent en haut du volume racine, tandis que les autres volumes apparaissent sous forme de dossiers quelque part.

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

Dans AppleScript, vous pouvez utiliser POSIX path of et as alias convertir entre ceux-ci.

Gordon Davisson
la source
-2

Votre script d'origine spécifiait "cp Macintosh HD ...", mais utilisez plutôt / Volumes / Macintosh \ HD .... En outre, il est préférable de mettre une barre oblique inversée avant tout espace, comme je l’ai fait précédemment avant HD. Cela serait vrai pour 'Application \ Support' également

Dickster
la source