4 votos

Montar automáticamente una unidad de red y copiar un archivo en una carpeta de red (AppleScript)

Tengo una tarea bastante compleja que resolver. No uso OS X, pero ahora tengo que proporcionar a algunos colegas una sencilla aplicación que copie automáticamente un determinado archivo a una carpeta de red. Normalmente usaría un shell script, pero una mínima GUI es algo imprescindible en este caso. Así que pensé que podría usar AppleScript.

Tendría que realizar estos pasos:

  1. Conectar a una unidad de red ( smb://myserver/public donde cada usuario tiene nombres de usuario y contraseñas diferentes, por lo que cablear los nombres de usuario y las contraseñas en el código no es una opción).
  2. Navegue a una carpeta en la unidad de red (cada usuario tiene una carpeta diferente en la unidad de red).
  3. Copiar un determinado archivo del escritorio del usuario a la carpeta abierta en la unidad de red.

Así que al ejecutar el script el usuario tiene que introducir su nombre de usuario y contraseña para conectar la unidad de red, y el usuario tiene que introducir el nombre de la carpeta en la que debe copiar el archivo. ¿Se puede almacenar el nombre de la carpeta de forma permanente de alguna manera? Para que el usuario no tenga que introducir el nombre de la carpeta cada vez que ejecute este script. Pero de vez en cuando estas carpetas pueden cambiar, así que tiene que haber una opción para cambiar la carpeta antes de copiar. Además, ¿cómo puedo comprobar si la unidad de red ya está montada, para que no se le pida al usuario el nombre de usuario y la contraseña cada vez que ejecute este script?


Hasta aquí he podido llegar en el montaje de un script para realizar esta tarea:

Me cuesta entender cómo le gusta a AppleScript almacenar una ruta de acceso a un archivo/carpeta en una unidad de red montada.

Así que esto es lo que tengo ahora:

property userName : "myfolder"
property folderName : "myusername"

property serverName : "public"
property serverAddress : "smb://myserver/public"
property serverStatus : 0

on connectToServer()
    global userName
    global folderName
    global serverName
    global serverAddress
    global serverStatus

    set mountedDisks to list disks
    if mountedDisks does not contain serverName then
        mount volume serverAddress as user name userName with password (display dialog "Enter password for" & quoted form of serverName with title "" default answer "" giving up after 3 with hidden answer)
    end if

    set mountedDisks to list disks
    if mountedDisks contains serverName then
        set serverStatus to 1
    else
        connectToServer()
    end if
end connectToServer

on mainLoop()
    global userName
    global folderName
    global serverName
    global serverAddress
    global serverStatus

    if serverStatus is equal to 0 then
        connectToServer()
    end if

    set mainDialog to display dialog ¬
        "Your username: " & userName & "
Your folder's name: " & folderName buttons {"Quit", "Settings", "Copy file"} with title "File Copier" default button 1
    set mainDialogAnswer to button returned of mainDialog

    if mainDialogAnswer is equal to "Quit" then
        quit
    end if

    if mainDialogAnswer is equal to "Settings" then
        display dialog "Enter your username" with title "Step 1 of 2" default answer userName
        set userName to {text returned of result}

        display dialog "Enter your folder's name" with title "Step 2 of 2" default answer folderName
        set folderName to {text returned of result}

        mainLoop()
    end if

    if mainDialogAnswer is equal to "Copy" then
        -- copy the file
    end if
end mainLoop

mainLoop()

3voto

Ryan Spears Puntos 1524

La copia de archivos en Applescript se realiza mejor a través de Eventos del sistema o Buscador utilizando el duplicate … to es decir, el comando

tell application "System Events" to duplicate sourceFile to targetFolder

donde ambos sourceFile y targetFolder deben ser del tipo de objeto correcto para la aplicación utilizada, es decir elemento del disco o elemento buscador (ambos objetos pueden ser creados desde AppleScript alias objetos, o valores de ruta textual con un poco de coerción de tipo - añadiría los detalles, pero no has dicho cómo se almacenan / adquieren las rutas de ambos en tu script).

Algunas notas sobre su código:

  • No hay necesidad de usar globales cuando ya se han definido como propiedades. Las propiedades de AppleScript tienen un alcance script y persisten a lo largo de la ejecución - sólo se restablecen cuando se recompila el script. Si asigna los que necesitan la configuración del usuario missing value al declarar, incluso se puede comprobar si ya están configurados y omitir volver a preguntar al usuario (habría una solución aún más cómoda y segura si Apple no hubiera desaprobado Keychain Access Scripting).

  • No hay necesidad de las asignaciones repetidas y la llamada recursiva en su connectToServer() manipulador. El siguiente código

    set timeOutCounter to 0
    repeat while (list disks) does not contain serverName and timeOutCounter is less than timeOutInterval
        -- mount drive
        delay someInterval -- recommended, so you don’t hectically loop
        set timeOutCounter to timeOutCounter + someInterval -- time out loop 
    end repeat

    intentará conectarse en el intervalo definido por someInterval hasta que la montura esté disponible o timeOutInterval (suponiendo que se declaren estos valores. Como propiedades, mejor - ver arriba).

  • También puede ofrecer a su usuario una forma más cómoda de seleccionar la carpeta de destino que teclear un nombre de carpeta de memoria. Consulte Adiciones estándar del diccionario AppleScript para el choose folder comando.

  • Por último, pero esto es principalmente una cuestión de gusto y estilo de codificación, prefiero mover el display dialog en su propio manejador y llamarlo, si se necesita repetidamente, desde el cuerpo del script, que usar un estilo C mainLoop manipulador. He descubierto que, en general, AppleScript se queda sin espacio en la pila fácilmente cuando recursa y puede confundirse mucho con las asignaciones de variables, por lo que es una buena idea evitar las construcciones recursivas cuando no son necesarias.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X