Cómo combinar el comando "Elegir carpeta" con la función "agregar elementos de carpeta" con Applescript

Estoy usando una acción de carpeta para crear una carpeta "activa", que duplica inmediatamente los archivos colocados en esta carpeta en una carpeta de respaldo específica.

Este es el script que estoy usando como acción de carpeta y funciona bien:

on adding folder items to this_folder after receiving these_items
   tell application "Finder" to duplicate these_items to folder 
   ("Macintosh HD:Users:photograper:Desktop:Target:")
end adding folder items to

Pero quiero ejecutar esta acción de carpeta como un applescript normal y activar la función "agregar elementos de carpeta" con el comando "Elegir carpeta". Así que puedo señalar manualmente una fuente específica y una carpeta de destino y ejecutar el script.

Intenté esto, pero ningún resultado:

set this_folder to choose folder with prompt "Select source folder:" 
with multiple selections allowed
set target_folder to choose folder with prompt "Select backup folder:"


on adding folder items to this_folder after receiving these_items
   tell application "Finder" to duplicate these_items to target_folder
end adding folder items to

¿Alguna sugerencia sobre cómo combinar las dos partes del scripting para que puedan interactuar?

¡Gracias!

Patricio

Respuestas (2)

Simplemente elimine el controlador y cambie la variable "estos_elementos" por "esta_carpeta", así:

set this_folder to choose folder with prompt "Select source folder:" with multiple selections allowed
set target_folder to choose folder with prompt "Select backup folder:"

tell application "Finder" to duplicate this_folder to target_folder

Luego ejecute el script como un script normal y copiará la carpeta por completo a su destino.

Si, por el contrario, solo desea que se copien los elementos (no la carpeta), puede usar esta variación:

set this_folder to choose folder with prompt "Select source folder:" with multiple selections allowed
set target_folder to choose folder with prompt "Select backup folder:"

tell application "Finder"
    set these_items to list folder of this_folder without invisibles
    repeat with i from 1 to count of these_items
        set ItemX to item i of these_items
        set ItemX to (this_folder & ItemX as string) as alias
        duplicate ItemX to target_folder
    end repeat
end tell

De cualquier manera, terminaría con un duplicado del contenido de la carpeta.

Ahora, dados sus comentarios a continuación, esta versión ejecutará el script como una acción de carpeta, pero recordará su carpeta de destino cuando declare una propiedad al comienzo del script. Si vuelve a compilar el script, le preguntará de nuevo.

property target_folder : ""

on adding folder items to this_folder after receiving these_items
    if target_folder = "" then
        set target_folder to ¬
            choose folder with prompt "Select source folder:" with multiple selections allowed
    else
        try
            --if the script has a property that has been deleted (i.e., the destination folder), it will cause 
            --an error that resolves by asking for a new folder
            set target_folder to target_folder as alias
        on error
            set target_folder to ¬
                ¬
                    choose folder with prompt "Select source folder:" with multiple selections allowed
        end try
    end if
    tell application "Finder" to duplicate these_items to folder target_folder
end adding folder items to

Espero que esto ayude.

Gracias por su respuesta, no quiero usar la acción de carpeta con las declaraciones "agregar elementos de carpeta". Cuando se coloca un archivo en la carpeta, no quiero que se duplique en una carpeta de destino inmediatamente. Eso es lo que no quiero. Traté de poner el comando "Elegir carpeta" para configurar el dest. carpeta dentro de las 2 declaraciones, pero luego, cada vez que se suelta un archivo, se activará la "ventana de selección". ¿Hay alguna manera de configurar la carpeta de destino una vez? ¿Cuál es utilizado por cada archivo colocado en la carpeta de origen? ¡Gracias!
esto es lo que intenté: al agregar elementos de carpeta a this_folder después de recibir estos_elementos, configure target_folder para elegir la carpeta con el mensaje "Seleccione la carpeta de copia de seguridad:" dígale a la aplicación "Finder" que duplique estos_elementos en target_folder y finalice la adición de elementos de carpeta a
Lo siento, entendí mal cuando dijiste que querías ejecutar "como un applescript normal". Entonces, si desea que la ventana de selección de carpetas aparezca solo una vez y, a partir de ese momento, use la misma carpeta, declara una propiedad al comienzo del script. Vea el correo electrónico editado arriba.
¡Sí! Esto es exactamente lo que quise decir y funciona. Intenté la declaración "si - entonces" antes, pero no sabía sobre la propiedad al principio. ¡Muchas gracias!
¿Hay alguna manera de que pueda configurar la carpeta de destino cada vez que uso el script en otra carpeta o cuando elimino la carpeta de destino? ¿Sin volver a compilar el script? En este momento, como dijiste, está recordando la carpeta de destino, incluso cuando eliminé la carpeta de destino. ¡Gracias!
Cuando eliminas la carpeta, sí. Editaré la secuencia de comandos en un minuto, pero no entiendo su comentario sobre "cada vez que use la secuencia de comandos en otra carpeta". ¿Quiere decir que si cambia la carpeta de origen, el destino también debería cambiar? (Oh, ¿y te importa hacer la pregunta como respondida?)
En mi situación, para cada sesión de fotos estoy usando una nueva carpeta que activaré con el guión. Para la carpeta de destino, estoy trabajando con varias unidades externas. Entonces puede ser que tenga que apuntar a una nueva carpeta de destino cuando estoy usando una unidad externa diferente para la copia de seguridad. ¡Vi tu nuevo guión, creo que es este! Lo probare mañana. ¡Muchas gracias por tu comentario!
Lo siento @MBUST No está funcionando. Cuando lo ejecuto por primera vez, hace lo que quiero. Pero cuando elimino la carpeta de destino y vuelvo a activar el script en una nueva carpeta, no me pide una nueva carpeta de destino. Incluso cuando se elimina la carpeta de destino, parece recordarla. Probé algunas cosas. pero no puede entender lo que está yendo mal.
Tienes razón. Acabo de ejecutar el script con y sin la acción de la carpeta. Sin la acción de la carpeta, si la carpeta está en la papelera, el script genera un error, como se desea. Si la secuencia de comandos se adjunta como una acción de carpeta, la duplicación simplemente se omite y la secuencia de comandos se cierra silenciosamente como si hubiera funcionado bien (pero no duplicó nada, por supuesto). No tengo tiempo para investigar esto en este momento, pero más adelante, si lo tengo, lo investigaré.

@Patrick de Gier, esta versión alterada del código de @MBUST, permite al usuario elegir una carpeta de destino cada vez

on adding folder items to this_folder after receiving these_items
    set target_folder to choose folder with prompt "SELECT TARGET FOLDER:" with multiple selections allowed
    tell application "Finder" to duplicate these_items to folder target_folder
end adding folder items to
Probé ese. Pero luego, el script le pedirá una carpeta de destino cada vez que se suelte un archivo en la carpeta. Lo que estoy buscando es una variante que cuando ejecute el código por primera vez, me pedirá que elija una carpeta de destino (como la variante de MBUST). Pero cuando la carpeta de destino está cambiando. Por ejemplo, cuando uso un disco duro externo para hacer una copia de seguridad un día y otro día uso otro disco duro externo como copia de seguridad (para sesiones de fotos), quiero que el script vea que falta la carpeta de destino y me pedirá que establezca un nuevo destino. carpeta. No se si es posible. ¡Gracias!
Perdón por la falta de claridad chicos! realmente aprecio toda su ayuda
Una variante de mi última iteración debería servir como modelo para manejar cuando falta el destino o la carpeta de destino. Y cuando no falten, el script usará la propiedad almacenada. Así que almacene cada variable de carpeta como una propiedad separada al comienzo del script, como le mostré en mi script anterior. Úsalo como modelo y obtendrás exactamente lo que quieres.