AppleScript do shell no funcionará en el directorio de Soporte de aplicaciones

4

Pasé el día haciendo varias investigaciones e intentando copiar un archivo que se encuentra dentro de una aplicación AppleScript en el directorio de Soporte de aplicaciones raíz ( hdd -> Library -> Application Support ). Originalmente, pensé que era un problema con las llamadas do shell script y administrator privileges , pero por alguna razón, si tengo un archivo ubicado en una aplicación AppleScript, trato de llamar a ese archivo para agregarlo al Soporte de aplicaciones, por ejemplo:

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

He bajado esto a la forma básica cuando se trata de la ruta de la carpeta y la ruta del archivo, pero cuando ejecuto la anterior, aparece un mensaje de error de:

  

cp: Macintosh   HD / Users / vader / someapp.app / Contents / Resources / Scripts / foobar.txt: No   tal archivo o directorio

Puedo devolver que el archivo existe en la aplicación 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

He intentado esto con:

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

pero eso tampoco funcionó.

Investigue cuando intenté eliminar el archivo después de agregarlo manualmente (sí, tengo permisos de administrador en mi carpeta):

He investigado varias áreas para ver cómo implementar las solicitudes de permisos usando administrator privileges pero sin suerte:

Estos son los siguientes intentos que he intentado:

Eventos del sistema AppleScript:

tell application "System Events" to delete file appWithPath

hacer intentos de shell:

intento 1

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

intento 2

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

Todavía no funcionaría y lo verifiqué con:

do shell script "echo " & appNamewithQuotedFormPath with administrator privileges

Después de profundizar en el Editor de scripts, descubrí que estaba obteniendo -10004 error , así que investigué:

así que moví la adición y eliminación del archivo en el Soporte de aplicaciones a un controlador que no tenía un bloque de prueba pero aún nada.

Pensando que podría ser un problema con los privilegios utilizados, probé todos los siguientes parámetros utilizados con Scripting Additions :

En una aplicación AppleScript, ¿cómo puedo agregar y eliminar un archivo que existe en la aplicación al directorio de soporte de aplicaciones raíz?

EDIT:

Después de realizar más pruebas, eliminé el uso de Macintosh HD y el do shell script funcionaría, por lo que no entiendo por qué causaría que el script fallara. ¿Por qué agregar Macintosh HD a la ruta causaría un error en la secuencia de comandos?

    
pregunta ʀ2ᴅ2 18.07.2017 - 21:30

3 respuestas

2

Si está codificando, sin probar si el archivo existe, use el siguiente ejemplo:

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 lo llama desde el script dentro del paquete de la aplicación, use el siguiente ejemplo:

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: Al trabajar con el comando do shell script , deben usarse las rutas de acceso de POSIX, no los alias. Macintosh HD no es válido en un POSIX path , solo en un alias. En un POSIX path del startup disk , todo comienza en la raíz del volumen : /

Ejemplo:

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)

Devoluciones:

Macintosh HD 
/
    
respondido por el user3439894 18.07.2017 - 23:37
1

@ user3439894 ya ha explicado cómo resolver el problema; Me gustaría intentar explicar por qué existe la confusión. Se remonta al hecho de que el sistema operativo Macintosh no siempre se basó en unix (/ POSIX). Antes de OS X (que está basado en Unix), Mac OS era un sistema operativo completamente diferente con su propia notación de ruta de archivo. Cuando OS X salió, tenía que admitir tanto las API de acceso a archivos de Unix (que utilizaban la notación de ruta de Unix) como las API de Mac OS tradicionales (que utilizaban la notación de ruta de Mac OS tradicional). A lo largo de los años, OS X (/ macOS) ha desaprobado algunas de las API tradicionales de Mac OS y ha cambiado cada vez más hacia la notación de ruta de Unix pura. Pero AppleScript es una excepción: es anterior a OS X, por lo que utiliza de forma nativa la antigua notación tradicional de Mac OS.

Aquí hay un resumen de las diferencias:

  • Las rutas Unix (/ POSIX) usan "/" como delimitadores (y permiten ":" dentro de los nombres de archivo), mientras que las rutas de Mac OS usan ":" como delimitadores (y permiten "/" dentro de los nombres de archivos).
  • Las rutas de Unix son absolutas si comienzan con el delimitador ("/"); Las rutas de Mac OS son absolutas si no comienzan con el delimitador (":").
  • Las rutas absolutas de Mac OS comienzan con el nombre del volumen, mientras que las rutas absolutas de Unix comienzan en la parte superior del volumen raíz, y otros volúmenes aparecen como carpetas en algún lugar debajo de él.

Aquí hay algunos ejemplos:

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, puedes usar POSIX path of y as alias para convertir entre estos.

    
respondido por el Gordon Davisson 19.07.2017 - 18:20
-2

Su secuencia de comandos original especificó "cp Macintosh HD ...", pero use / Volumes / Macintosh \ HD ... en su lugar. Además, es mejor poner una barra invertida antes de cualquier espacio en blanco, como lo hice anteriormente antes de HD. Eso también sería cierto para 'Application \ Support'

    
respondido por el Dickster 24.08.2018 - 07:26

Lea otras preguntas en las etiquetas