La shell AppleScript non funzionerà nella directory del supporto dell'applicazione

4

Ho trascorso la giornata facendo diverse ricerche e tentativi su come copiare un file che si trova all'interno di un'app AppleScript nella directory di supporto dell'applicazione radice ( hdd -> Library -> Application Support ). Inizialmente pensavo che si trattasse di un problema con la chiamata di do shell script e administrator privileges , ma per qualche ragione se ho un file che si trova in un'app AppleScript provo a chiamare quel file da aggiungere all'Application Support, ad esempio:

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

L'ho portato al form di base quando si tratta del percorso della cartella e del percorso del file, ma quando corro quanto sopra ricevo un messaggio di errore di:

cp: Macintosh HD/Users/vader/someapp.app/Contents/Resources/Scripts/foobar.txt: No such file or directory

Posso restituire vero che il file esiste nell'app con:

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

Ho provato questo con:

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

ma non ha funzionato.

Ricerche quando ho provato a rimuovere il file dopo averlo aggiunto manualmente (sì, ho i permessi di amministratore sulla mia casella):

Ho studiato diverse aree per vedere come implementare la richiesta di autorizzazioni utilizzando administrator privileges ma senza fortuna:

Ecco i seguenti tentativi che ho provato:

Eventi di sistema di AppleScript:

tell application "System Events" to delete file appWithPath

eseguono i tentativi della shell:

tentativo 1

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

tentativo 2

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

Ancora non funzionerebbe e ho controllato con:

do shell script "echo " & appNamewithQuotedFormPath with administrator privileges

Dopo aver scavato nello Script Editor ho scoperto che stavo ottenendo -10004 error , quindi ho cercato:

quindi ho spostato l'aggiunta e la rimozione del file in Application Support a un gestore che non aveva un blocco try ma ancora nulla.

Pensando che potrebbe essere un problema con i privilegi utilizzati Ho provato tutti i seguenti parametri utilizzati con Scripting Additions :

In un'app AppleScript, come posso aggiungere e rimuovere un file esistente nell'app nella directory di supporto dell'applicazione radice?

Modifica

Dopo ulteriori test ho rimosso l'utilizzo di Macintosh HD e il do shell script funzionerebbe, ma non capisco perché ciò potrebbe causare il fallimento dello script. Perché l'aggiunta di Macintosh HD al percorso può causare errori nello script?

    
posta ʀ2ᴅ2 18.07.2017 - 21:30
fonte

3 risposte

2

Se si sta eseguendo l'hardcoding, senza test se il file esiste, quindi utilizzare il seguente esempio:

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

Se lo chiami dallo script all'interno del pacchetto di applicazioni, utilizza il seguente esempio:

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

Nota: quando si utilizza il comando do shell script , è necessario utilizzare i nomi percorso POSIX, non gli alias. Macintosh HD non è valido in POSIX path , solo in un alias. In POSIX path di startup disk , tutto inizia nella radice del volume : /

Esempio:

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)

Returns:

Macintosh HD 
/
    
risposta data 18.07.2017 - 23:37
fonte
1

@ user3439894 ha già spiegato come risolvere il problema; Mi piacerebbe provare a spiegare perché esiste la confusione. Si torna al fatto che il sistema operativo Macintosh non era sempre basato su unix (/ POSIX). Indietro prima di OS X (che è basato su unix), Mac OS era un sistema operativo completamente diverso con la sua notazione sul percorso dei file. Quando uscì OS X, doveva supportare sia le API di accesso ai file unix (che utilizzavano la notazione del percorso unix) sia le tradizionali API Mac OS (che utilizzavano la notazione del percorso Mac OS tradizionale). Nel corso degli anni, OS X (/ macOS) ha deprecato alcune delle tradizionali API per Mac OS e ha cambiato sempre più verso la notazione del percorso unix puro. Ma AppleScript è un'eccezione: precede OS X, quindi utilizza nativamente la vecchia notazione tradizionale Mac OS.

Ecco un riepilogo delle differenze:

    I percorsi
  • Unix (/ POSIX) usano "/" come delimitatori (e permettono ":" nei nomi dei file), mentre i percorsi Mac OS usano ":" come delimitatori (e permettono "/" nei nomi dei file).
  • I percorsi Unix sono assoluti se iniziano con il delimitatore ("/"); I percorsi Mac OS sono assoluti se non iniziano con il delimitatore (":").
  • I percorsi di Mac OS assoluti iniziano con il nome del volume, mentre i percorsi unix assoluti iniziano nella parte superiore del volume di root e altri volumi vengono visualizzati come cartelle da qualche parte al di sotto di esso.

Ecco alcuni esempi:

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

In AppleScript, puoi utilizzare POSIX path of e as alias per convertire tra questi.

    
risposta data 19.07.2017 - 18:20
fonte
-2

Lo script originale specificato "cp Macintosh HD ...", ma utilizza / Volumi / Macintosh \ HD ... invece. Inoltre, è meglio mettere un backslash prima di ogni vuoto, come ho fatto sopra prima dell'HD. Ciò vale anche per "Application \ Support"

    
risposta data 24.08.2018 - 07:26
fonte

Leggi altre domande sui tag