3 votos

Cómo excluir archivos bloqueados o carpetas en un AppleScript que selecciona todos los archivos en una carpeta en particular

Aquí está mi situación. He creado un AppleScript para la limpieza de mi escritorio. Esencialmente, selecciona todos los archivos y carpetas de mi escritorio, crea una nueva carpeta con un nombre específico y el formato de fecha, y mueve todos los archivos de mi escritorio a la carpeta nueva. Este script funciona de maravilla hasta que me di cuenta de que en ocasiones hay archivos o carpetas que yo quería permanecer en mi escritorio. Mi solución fue abrir la ventana de información para cada archivo o carpeta que quería permanecer en mi escritorio, y seleccione la opción "bloquear" en la ventana de información.

Mi problema ahora es porque de los archivos bloqueados, el script no se puede ejecutar sin mostrar un mensaje de error. Si hago clic en "ACEPTAR" en el mensaje de error, la secuencia de comandos de acabado y mover todos los archivos con la excepción de los que están bloqueados.

Yo preferiría no tener que ir a través de este paso adicional haciendo clic en el botón aceptar. He intentado añadir algunos de eventos del sistema de acciones para la secuencia de comandos para que automáticamente haga clic en el botón "aceptar" y que no funciona.

Estoy empezando a pensar que la única solución real sería no seleccione los archivos bloqueados o carpetas en el primer lugar. Aquí es donde yo estoy perdido. ¿Alguien puede ayudar a dirigir a mí en cuanto a cómo evitar la selección de los archivos bloqueados en el primer lugar?

enter image description here


Aquí está la secuencia de comandos en su totalidad.


set scriptPath to (load script file "Macintosh HD:Users:Smokestack:Library:Mobile Documents:com~apple~ScriptEditor2:Documents:Cleanup Desktop.scptd:Contents:Resources:Scripts:Current Time A.M. P.M. And Short Date.scpt")

tell scriptPath
    timeandDate() -- This will get the time and date in this format "05/31/2017 @ 9:10:48 PM" called from the loaded script file above
end tell

set timeandDate to the result -- This will copy the time and date results from the previous step and and set it as this new variable

tell application "Finder"
    if running then
        close every window
        activate
        make new Finder window
        set target of Finder window 1 to folder "Desktop" of folder "Smokestack" of folder "Users" of startup disk
    end if
    open Finder window 1
    activate
end tell

delay 1
tell application "System Events"
    key code 0 using (command down) -- This will select all files and folders on the desktop in the active finder window
end tell

tell application "Finder"
    set these_items to the selection
    set destinationFolder to make new folder at POSIX file "/Users/Smokestack/Jimz_Important_Stuff/Desktop_Cleanups/" with properties {name:timeandDate}
    move these_items to destinationFolder
    reveal destinationFolder
end tell

Aquí es una versión revisada de la secuencia de comandos sin necesidad de llamar a los manejadores de archivos externos

on timeandDate()
    set CurrentTime to (time string of (current date))
    set AppleScript's text item delimiters to ","
    set theLongDate to (current date)
    set theLongDate to (date string of theLongDate)
    set currentMonth to (word 1 of text item 2 of theLongDate)
    set currentDay to (word 2 of text item 2 of theLongDate)
    set currentYear to (word 1 of text item 3 of theLongDate)
    set monthList to {January, February, March, April, May, June, July, August, September, October, November, December}
    repeat with x from 1 to 12
        if currentMonth = ((item x of monthList) as string) then
            set theRequestNumber to (text -2 thru -1 of ("0" & x))
            exit repeat
        end if
    end repeat
    set currentMonth to theRequestNumber
    set currentDay to (text -2 thru -1 of ("0" & currentDay))
    set theShortDate to (currentMonth & "/" & currentDay & "/" & currentYear) as string
    set CurrentTime to (time string of (current date))
    set CurrentTimeandShortDate to (theShortDate & " @ " & CurrentTime)
    set AppleScript's text item delimiters to ""
end timeandDate

timeandDate()

set timeandDate to the result

tell application "Finder"
    close every window
    activate
    make new Finder window
    set target of Finder window 1 to folder "Desktop" of folder "Smokestack" of folder "Users" of startup disk
    select every file of the front Finder window 
    delay 1
    set these_items to the selection
    set destinationFolder to make new folder at POSIX file "/Users/Smokestack/Jimz_Important_Stuff/Desktop_Cleanups/" with properties {name:timeandDate}
    try
        move these_items to destinationFolder
    end try
    reveal destinationFolder
end tell

Después de hacer algunas revisiones a la secuencia de comandos, mientras el bloqueo de los artículos en mi escritorio son solo las carpetas y los archivos no, ahora este script funciona de maravilla. Sin embargo, todavía va a generar un error si hay algún individuo archivos bloqueados.

3voto

Monomeeth Puntos 139

Mi enfoque sería para poner algo de tu código en un try bloque y también el uso de on error a ignorar el mensaje de error específico, pero para mostrar un mensaje si se encuentra un error diferente en su lugar.

La ventaja de este enfoque es que no estás diciendo la secuencia de comandos para ignorar todos los errores, en caso de que algo ocurre y usted debe ser consciente de ello.

Para lograr esto, pruebe lo siguiente:

set scriptPath to (load script file "Macintosh HD:Users:Smokestack:Library:Mobile Documents:com~apple~ScriptEditor2:Documents:Cleanup Desktop.scptd:Contents:Resources:Scripts:Current Time A.M. P.M. And Short Date.scpt")

tell scriptPath
    timeandDate() -- This will get the time and date in this format "05/31/2017 @ 9:10:48 PM" called from the loaded script file above
end tell

set timeandDate to the result -- This will copy the time and date results from the previous step and and set it as this new variable

tell application "Finder"
    if running then
        close every window
        activate
        make new Finder window
        set target of Finder window 1 to folder "Desktop" of folder "Smokestack" of folder "Users" of startup disk
    end if
    open Finder window 1
    activate
end tell

delay 1
tell application "System Events"
    key code 0 using (command down) -- This will select all files and folders on the desktop in the active finder window
end tell

tell application "Finder"
    try
        set these_items to the selection
        set destinationFolder to make new folder at POSIX file "/Users/Smokestack/Jimz_Important_Stuff/Desktop_Cleanups/" with properties {name:timeandDate}
        move these_items to destinationFolder
        reveal destinationFolder
    on error error_message number error_number
        if the error_number is not -50 then
            display dialog error_message buttons {"OK"} default button 1
        end if
    end try

end tell

Ahora, verás que he puesto el segundo bloque de tell application "Finder" código dentro de una try bloque (te darás cuenta de que el uso de try y end try. Y, dentro de ese bloque, he insertado el siguiente código:

    on error error_message number error_number
    if the error_number is not -50 then
        display dialog error_message buttons {"OK"} default button 1
    end if

Básicamente, este debe tener el efecto de decirle a la secuencia de comandos que en el caso de un Buscador de error de -50 a ignorar, pero si no -50, a continuación, mostrar el error. (Estoy asumiendo que este es el error en el script obtiene - si no se puede sustituir la -50 con el número de error correcto.

Obviamente, yo no puedo probar esto en mi final, así que por favor, hágamelo saber cómo se va.

3voto

user3439894 Puntos 5883

Actualización: Como ya he mencionado en alguna parte en los comentarios que me gustaría construir un 10.12.5 sistema de este pasado fin de semana y hacer algunas pruebas, yo lo hice.

Aquí es lo que he encontrado:

  • El código de mi respuesta, inclusive de edición 5 de Jun 2, a las 15:34, funciona en mi sistema sin problema.
  • Después de una revisión de todo el código y los comentarios, me di cuenta de que mientras mi código, como es, trabajó en mi sistema y me dio una nota en referencia a la delay comando tener que ajustar los valores de y o añadir/quitar/si es necesario, etc., que esto principalmente se reduce a cuestiones de tiempo y las dificultades de esa forma particular de evento de codificación.

Por lo tanto, y mientras yo voy a dejar el original de la respuesta en la parte inferior de esta actualización, me decidí a buscar en esto desde un diferente programática ángulo y ofrecen el siguiente código como una mejor forma de código de este script para realizar la tarea en mano.

Este nuevo código, no se basa en el cierre de abrir el Buscador de windows y, a continuación, la apertura de un Buscador de la ventana del Escritorio de la carpeta del Usuario para luego tener los Eventos del Sistema seleccionar todos los elementos en la carpeta de destino, o el uso de la delay comando para lidiar con los problemas de sincronización, etc. Todo lo cual yo, personalmente, no me gusta, porque no quiero que todo Buscador de windows me han abierto, cerrado para realizar una tarea como esta. O código de salir de la existente de windows abierto, garantizando el Buscador de la ventana del Escritorio de la carpeta dentro de la Casa de la carpeta es el superior del Buscador de la ventana para asegurarse de Eventos del Sistema selecciona la correcta artículos y obtener los intervalos de derecho, etc.!

El siguiente AppleScript código ofrece un más seguro y más rápido para llevar a cabo la tarea en mano y os animo a utilizar a lo largo de la anterior código de los ejemplos.

Nota: Con la anterior de supuestos en juego, (la existencia de la carpeta de la carpeta de destino se crea en el, etc.), usted no debe no debe modificar este código y debe ser capaz de utilizar como es. Es decir, estamos ciertamente en libertad de modificar el código de todos modos usted necesita o quiere, pero como es, se debe trabajar.

Nueva AppleScript código:

tell current application
    try
        tell application "Finder"
            if running then
                set theseFileSystemObjects to (get every item of (path to desktop))
                set theFileSystemObjectsNotLocked to {}
                repeat with i from 1 to (count of theseFileSystemObjects)
                    set thisFileSystemObject to (item i of theseFileSystemObjects)
                    if not locked of (get properties of thisFileSystemObject) then
                        set end of theFileSystemObjectsNotLocked to thisFileSystemObject
                    end if
                end repeat
                if theFileSystemObjectsNotLocked is not equal to {} then
                    tell current application to set theDateTimeNow to ¬
                        (do shell script "date '+%m.%d.%Y @ %I.%M.%S %p'") as string
                    set theDestinationFolder to make new folder at ¬
                        ((path to home folder as string) & "Jimz_Important_Stuff:Desktop_Cleanups:") with properties {name:theDateTimeNow}
                    move theFileSystemObjectsNotLocked to theDestinationFolder
                    open theDestinationFolder
                    activate theDestinationFolder
                end if
            else
                tell current application
                    activate
                    display dialog "Finder is not currently running!" & linefeed & linefeed & ¬
                        "Open Finder, then run Desktop Clean Up again." buttons {"OK"} ¬
                        default button 1 with title "Desktop Clean Up"
                end tell
            end if
        end tell
    on error eStr number eNum
        activate
        display dialog eStr & " number " & eNum buttons {"OK"} ¬
            default button 1 with title "Desktop Clean Up" with icon caution
        return
    end try
end tell

Original Respuesta:

Este es un ejemplo de cómo yo iba a escribir la totalidad de la secuencia de comandos a ejecutar, como es, como un .scpt archivo o una .aplicación de archivo, en su sistema. Estoy diciendo que el sistema, porque el destino de la carpeta de destino se establece para su sistema.

No hay necesidad de cargar un recurso externo y no de controlador para establecer el valor de la variable utilizada para la carpeta de destino nombre. Yo elijo usar una do shell script comando para que, utilizando la date comando para devolver una fecha personalizada de tiempo variable de cadena, ya que es una línea de código en comparación con la cantidad de código en la on timeandDate() de controlador, y devuelve el mismo patrón.

Voy a seguir para utilizar esta en mi sistema con ajustada adecuadamente los nombres de ruta y un diferente patrón de las carpetas de destino nombre, en sustitución de la / y : con . en la fecha personalizado de tiempo variable de cadena que se utiliza en la carpeta de destino nombre.

Como codificado, esta primera versión de la secuencia de comandos se mueve todos los objetos del sistema de archivos, que no bloqueado, actualmente en la carpeta del Escritorio a la carpeta de destino. La secuencia de comandos incluye mínimo adecuado manejo de errores y como están codificados usted no tiene los problemas que estaba teniendo. Por supuesto, esto supone que el $HOME/Jimz_Important_Stuff/Desktop_Cleanups carpeta existe. Si no, usted obtendrá el mensaje de error apropiado, sin embargo adicionales de control de error podría ser añadido a crear el jerárquica de la estructura plegada como/si es necesario.

Esta primera secuencia de comandos debe resolver todos los problemas que están teniendo con su propio código y de la OMI es una mejor manera el código, a continuación, acaba de atrapar y comer el error con sólo un try declaración solo, porque tal como ha sido codificado, sólo puede mover los archivos que son no bloqueado y ni siquiera intenta mover un archivo bloqueado.

Esto fue probado en macOS 10.12.3 y debe trabajar para usted en macOS 10.12.5, que está actualmente en ejecución.

AppleScript Código:


tell current application
    try
        set theDateTimeNow to (do shell script "date '+%m/%d/%Y @ %I:%M:%S %p'") as string
        tell application "Finder"
            if running then
                close every window
                set target of (make new Finder window) to (path to desktop)
                activate
                delay 0.5
                tell application "System Events" to key code 0 using {command down}
                delay 0.5
                set theseFileSystemObjects to the selection
                set theDestinationFolder to make new folder at ¬
                    ((path to home folder as string) & "Jimz_Important_Stuff:Desktop_Cleanups:") with properties {name:theDateTimeNow}
                set theListOfFileSystemObjectsNotLocked to {}
                repeat with i from 1 to (count of theseFileSystemObjects)
                    set thisFileSystemObject to (item i of theseFileSystemObjects)
                    if not locked of thisFileSystemObject then
                        set end of theListOfFileSystemObjectsNotLocked to thisFileSystemObject
                    end if
                end repeat
                move theListOfFileSystemObjectsNotLocked to theDestinationFolder
                reveal theDestinationFolder
            else
                tell current application
                    activate
                    display dialog "Finder is not currently running!" & linefeed & linefeed & ¬
                        "Open Finder, then run Desktop Clean Up again." buttons {"OK"} ¬
                        default button 1 with title "Desktop Clean Up" with icon caution
                end tell
            end if
        end tell
    on error eStr number eNum
        activate
        display dialog eStr & " number " & eNum buttons {"OK"} ¬
            default button 1 with title "Desktop Clean Up" with icon caution
        return
    end try
end tell

Nota: Como el valor de la delay comandos, pueden necesitar ser ajustadas a su sistema y / o adicionales añadidos como/si es necesario y / o retirar si no es necesario. Como está codificado, este script ha funcionado sin problema, docenas de veces en las pruebas, en mi sistema, con diferentes tamaños y recuentos de objetos del sistema de archivos se actuó en la carpeta del Escritorio. Realice los ajustes necesarios.

Los objetos del sistema de archivos probados fueron, archivos, carpetas, alias, enlaces simbólicos, la aplicación de paquetes y documentos haces, los dos últimos de los cuales son sólo las carpetas. Estos FSOs eran de distintos tamaños, tanto cerrada y no bloqueada.


Esta segunda versión de la secuencia de comandos que va más allá de sus necesidades expresadas y hace una copia de el cerrado de objetos del sistema de archivos en la actualidad en la carpeta del Escritorio a la carpeta de destino, mientras que el reinicio de bloqueo de la bandera en el duplicados para que puedan ser eliminados sin levantar una bandera en el momento en el que usted puede elegir para eliminarlos. La incluyo ya que puede tener un valor añadido y que les sea útil.

AppleScript Código:


tell current application
    try
        set theDateTimeNow to (do shell script "date '+%m/%d/%Y @ %I:%M:%S %p'") as string
        tell application "Finder"
            if running then
                close every window
                set target of (make new Finder window) to (path to desktop)
                activate
                delay 0.5
                tell application "System Events" to key code 0 using {command down}
                delay 0.5
                set theseFileSystemObjects to the selection
                set theDestinationFolder to make new folder at ¬
                    ((path to home folder as string) & "Jimz_Important_Stuff:Desktop_Cleanups:") with properties {name:theDateTimeNow}
                set theListOfFileSystemObjectsNotLocked to {}
                set theListOfLockedFileSystemObjects to {}
                repeat with i from 1 to (count of theseFileSystemObjects)
                    set thisFileSystemObject to (item i of theseFileSystemObjects)
                    if not locked of thisFileSystemObject then
                        set end of theListOfFileSystemObjectsNotLocked to thisFileSystemObject
                    else
                        set end of theListOfLockedFileSystemObjects to thisFileSystemObject
                    end if
                end repeat
                move theListOfFileSystemObjectsNotLocked to theDestinationFolder
                duplicate theListOfLockedFileSystemObjects to theDestinationFolder
                repeat with i from 1 to (count of theListOfLockedFileSystemObjects)
                    set thisFileSystemObject to (item i of theListOfLockedFileSystemObjects)
                    set locked of alias ((theDestinationFolder as string) & name of thisFileSystemObject) to false
                end repeat
                reveal theDestinationFolder
            else
                tell current application
                    activate
                    display dialog "Finder is not currently running!" & linefeed & linefeed & ¬
                        "Open Finder, then run Desktop Clean Up again." buttons {"OK"} ¬
                        default button 1 with title "Desktop Clean Up" with icon caution
                end tell
            end if
        end tell
    on error eStr number eNum
        activate
        display dialog eStr & " number " & eNum buttons {"OK"} ¬
            default button 1 with title "Desktop Clean Up" with icon caution
        return
    end try
end tell

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