Tengo una tarea bastante compleja que resolver. No uso OS X, pero ahora tengo que proporcionarles a algunos colegas una aplicación simple que copia automáticamente un determinado archivo a una carpeta de red. Normalmente usaría un script de shell, pero una GUI mínima es imprescindible en este caso. Así que pensé que podría usar AppleScript.
Tendría que realizar estos pasos:
smb://myserver/public
, donde cada usuario tiene diferentes nombres de inicio de sesión y contraseñas, por lo que conectar los nombres de usuario y contraseñas en el código no es una opción).Entonces, al ejecutar el script, el usuario debe ingresar su nombre de usuario y contraseña para conectarse a la unidad de red, y el usuario debe ingresar el nombre de la carpeta en la que debe copiar el archivo. ¿Se puede almacenar permanentemente el nombre de la carpeta de alguna manera? Por lo tanto, el usuario no tendrá que ingresar el nombre de la carpeta cada vez que ejecute este script. Pero de vez en cuando estas carpetas pueden cambiar, por lo que debe haber una opción para cambiar la carpeta antes de copiar. Además, ¿cómo puedo verificar si la unidad de red ya está montada, por lo que no se le pedirá al usuario el nombre de usuario y la contraseña cada vez que ejecute este script?
Esto es lo lejos que he podido llegar al ensamblar un script para realizar esta tarea:
Me cuesta entender cómo le gusta a AppleScript almacenar una ruta 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()
La copia de archivos en Applescript se realiza mejor a través de Eventos del sistema o Finder , usando el duplicate … to
comando, es decir
tell application "System Events" to duplicate sourceFile to targetFolder
donde ambos sourceFile
y targetFolder
deben ser el tipo de objeto correcto para la aplicación utilizada, es decir, elemento de disco o elemento de búsqueda (ambos objetos se pueden crear a partir de objetos de alias de AppleScript o valores de ruta textual con un poco de coerción de tipo; agregaría los detalles, pero no ha indicado cómo se almacenan / adquieren las rutas a ambos en su secuencia de comandos).
Algunas notas sobre su código:
missing value
al declarar, puede incluso verificar si ya están configurados y omitir volver a solicitar al usuario (habría una solución aún más cómoda y segura si Apple no hubiera desaprobado las secuencias de comandos de acceso a llaveros).No hay necesidad de asignaciones repetidas y llamadas recursivas en su connectToServer()
controlador. 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 el montaje esté disponible o timeOutInterval
se alcance (suponiendo que estos valores estén declarados. Como propiedades, lo mejor; consulte más arriba).
choose folder
para el comando.display dialog
comando a su propio controlador y llamarlo, si es necesario repetidamente, desde el cuerpo del script, que usar un mainLoop
controlador de estilo C. Descubrí que, en términos generales, AppleScript se queda sin espacio en la pila fácilmente cuando recurre y puede confundirse mucho con las asignaciones de variables, por lo que es una buena idea evitar las construcciones recursivas cuando no son necesarias.delay
mide en segundos.delay
medidas en segundos. Tendrá que probar un poco en diferentes sistemas. Le recomiendo que establezca su tiempo de espera en un tiempo y medio o dos veces el tiempo de conexión más lento que encuentre, y su retraso en aproximadamente el tiempo de conexión más rápido que encuentre.
bmike
kopischke