AppleScript do shell nie będzie działał w katalogu wsparcia aplikacji

4

Spędziłem dzień, przeprowadzając kilka badań i prób skopiowania pliku znajdującego się w aplikacji AppleScript do głównego katalogu obsługi aplikacji ( hdd -> Library -> Application Support). Początkowo myślałem, że to problem z wywołaniem do shell scripta administrator privilegesjednak z jakiegoś powodu, jeśli mam plik znajdujący się w aplikacji AppleScript staram się nazwać ten plik, aby być dodane do obsługi aplikacji, na przykład:

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

Sprowadziłem to do podstawowej formy, jeśli chodzi o ścieżkę folderu i ścieżkę pliku, ale po uruchomieniu powyższego pojawia się komunikat o błędzie:

cp: Macintosh HD / Users / vader / someapp.app / Contents / Resources / Scripts / foobar.txt: Brak takiego pliku lub katalogu

Mogę zwrócić wartość true, że plik istnieje w aplikacji za pomocą:

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

Próbowałem tego z:

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

ale to też nie działało.

Sprawdź, kiedy próbowałem usunąć plik po ręcznym dodaniu go (tak, mam uprawnienia administratora na moim urządzeniu):

Przebadałem kilka obszarów, aby zobaczyć, jak wdrożyć monitowanie o uprawnienia przy użyciu, administrator privilegesale bez powodzenia:

Oto następujące próby, które próbowałem:

Zdarzenia systemowe AppleScript:

tell application "System Events" to delete file appWithPath

wykonaj próby powłoki:

próba 1

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

próba 2

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

To nadal nie działa i sprawdziłem za pomocą:

do shell script "echo " & appNamewithQuotedFormPath with administrator privileges

Po zagłębieniu się w edytor skryptów odkryłem, że dostaję, -10004 errorwięc zbadałem:

więc przeniosłem dodawanie i usuwanie pliku z obsługi aplikacji do modułu obsługi, który nie miał bloku próbnego, ale wciąż nic.

Myśląc, że może to być problem z używanymi uprawnieniami, wypróbowałem wszystkie następujące parametry używane z Scripting Additions:

wprowadź opis zdjęcia tutaj

W jaki sposób w aplikacji AppleScript mogę dodawać i usuwać plik istniejący w aplikacji do głównego katalogu obsługi aplikacji?


EDYTOWAĆ:

Po dalszych testach usunąłem użycie Macintosh HDi do shell scriptdziałałoby, którego nie rozumiem, dlaczego spowodowałoby to awarię skryptu. Dlaczego dodanie Macintosh HDdo ścieżki spowodowałoby błąd skryptu?

ʀ2ᴅ2
źródło

Odpowiedzi:

2

Jeśli kodujesz na stałe, bez sprawdzania, czy plik istnieje, skorzystaj z następującego przykładu:

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

Jeśli wywołujesz go ze skryptu w pakiecie aplikacji, skorzystaj z następującego przykładu:

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

Uwaga: Podczas pracy z do shell script poleceniem należy używać ścieżek POSIX, a nie aliasów. Macintosh HDnie jest poprawne w POSIX pathaliasie. W sposób POSIX pathz startup disk, wszystko zaczyna się w korzeniu o objętości :/

Przykład:

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)

Zwroty:

Macintosh HD 
/
użytkownik3439894
źródło
1

@ user3439894 wyjaśnił już, jak rozwiązać problem; Chciałbym spróbować wyjaśnić, dlaczego zamieszanie istnieje. Wraca do faktu, że Macintosh OS nie zawsze był oparty na Uniksie (/ POSIX). Jeszcze przed OS X (opartym na Uniksie) Mac OS był zupełnie innym systemem operacyjnym z własną notacją ścieżki pliku. Kiedy pojawił się OS X, musiał obsługiwać zarówno interfejsy API dostępu do plików unix (które używały notacji ścieżki uniksowej), jak i tradycyjne interfejsy API systemu Mac OS (które używały tradycyjnej notacji ścieżki systemu Mac OS). Z biegiem lat OS X (/ macOS) wycofał niektóre tradycyjne interfejsy API systemu Mac OS i coraz bardziej przechodził na czystą notację ścieżki uniksowej. Ale AppleScript jest wyjątkiem: poprzedza OS X, więc natywnie używa starej tradycyjnej notacji Mac OS.

Oto podsumowanie różnic:

  • Ścieżki uniksowe (/ POSIX) używają „/” jako ograniczników (i zezwalają na „:” w nazwach plików), podczas gdy ścieżki systemu Mac OS używają „:” jako ograniczników (i zezwalają na „/” w nazwach plików).
  • Ścieżki uniksowe są bezwzględne, jeśli zaczynają się od separatora („/”); Ścieżki systemu Mac OS są bezwzględne, jeśli nie zaczynają się od separatora („:”).
  • Ścieżki bezwzględne w systemie Mac OS rozpoczynają się od nazwy woluminu, natomiast ścieżki bezwzględne w systemie Unix zaczynają się na górze woluminu głównego, a inne woluminy pojawiają się gdzieś pod nim jako foldery.

Oto kilka przykładów:

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

W AppleScript możesz używać POSIX path ofi as aliaskonwertować między nimi.

Gordon Davisson
źródło
-2

W twoim oryginalnym skrypcie określono „cp Macintosh HD ...”, ale zamiast tego użyj / Volumes / Macintosh \ HD ... Ponadto najlepiej jest wstawić ukośnik odwrotny przed dowolnym pustym miejscem, tak jak wcześniej przed HD. Odnosi się to również do „Application \ Support”

Dickster
źródło