1 votos

Applescript salidas de retorno antes de completar

Tengo que ir a través de una pila de discos duros y memorias usb buscando viejos quickbook archivos. Por lo tanto, he escrito un applescript que se dispara cuando una nueva unidad está montada. Se busca la unidad para qbb o qbo archivos y los copias a una carpeta en la unidad principal.

Lo tengo funcionando casi a la perfección, pero, para la vida de mí, no puedo conseguir la repetición de bucle para que se ejecute pasado el primer elemento de la lista. Así, se agarra qbb archivos, pero no qbo archivos. Sé que está fallando porque puedo activar con un USB kye que ha ficticio qbo y qbb archivos en él.

Sé que me falta algo obvio, pero mantener el trasiego de mi cerebro fue en vano.

Aquí está mi script. Por favor alguien puede darme verificación de cordura (y la solución)?

Gracias!

on adding folder items to thisFolder after receiving addedItems

   # set the path for the files to be copied too.
   set thePath to ((path to home folder as text) & "00_QBB:")
   if not pathExists(thePath) then
       display dialog "Could not find the path. Files have not been copied."
       return
   end if

   try
       # get name of Loaded Drive
       set loadedDriveName to item 1 of addedItems

       # set paths for source source drive
       set loadedDrive to POSIX path of loadedDriveName 

       # create folder, named for Loaded Drive, for inbound copies
       set thePath to thePath & loadedDriveName
       set thePath to POSIX path of thePath
       set makeFolder to "mkdir " & thePath 
       # display dialog makeFolder
       do shell script (makeFolder)

       # set search criteria
       set qbFileTypes to {"qbb", "qbo"}

       # lookthrough drive for desired file types to find and copy
       repeat with n from 1 to (count of qbFiletypes)
           set qbCount to (count of qbFiletypes)
           set qbCurrentType to (item n of qbFiletypes)
           # display dialog qbCurrentType & " + " & qbCount
           set grab_qbb to "find " & loadedDrive & " -iname \"*" & qbCurrentType & "*\" -exec cp {} " & thePath & " \\;"
           # display dialog grab_qbb
           do shell script (grab_qbb)
       end repeat

       on error
           display dialog "Could not copy files."
       return
   end try

end adding folder items to

on pathExists(thePath) -- pathExists("path:to:folder: OR :file")
   try
       get thePath as alias
       return true
       on error
       return false
   end try
end pathExists

1voto

user3439894 Puntos 5883

Me hubiera ido sobre esto un poco diferente.

En primer lugar, me gustaría utilizar el Disco de Árbitro, de modo que los discos externos sería montar sólo de lectura y no de preformas de cualquier Foco de indexación. No hay necesidad de permitir la indexación de si el objetivo es sólo .qbb y .qbo archivos a se encuentra utilizando el find comando.

Segundo, yo uso una de Automator Carpeta Acción con Ejecutar el Shell Script de acción, como la OMI es sólo mucho más fáciles de código.

El siguiente ejemplo bash código de preformas de estas tareas:

  • Crea todas destino directorios como sea necesario.
  • Maneja los discos con varios volúmenes.
  • Encuentra la .qbb y .qbo archivos y copias de ellos.
  • Expulsa el disco de destino cuando haya finalizado la copia.
  • Notifica que el proceso se ha completado.

También, como una de Automator Carpeta Acción hay un icono en la barra de menú, que además de ser un indicador visual de un proceso se está ejecutando, también le permite a uno para terminar el proceso si es necesario.

El programa de instalación de la Automator Carpeta Acción como se muestra a continuación:

Automator Folder Action

        Sugerencia: Abrir imagen en nueva pestaña para ver claramente la configuración.


Cuando termine el proceso, se muestra la siguiente notificación y hace un sonido, que puede ser omitido si no quería.

Notification Image


Ejemplo bash código de:

p="$HOME/00_QBB"

[ ! -d "${p}" ] && mkdir "${p}"

for d in "$@"; do
    n="$(basename "$d")"
    mkdir -p "${p}/${n}"
    find "$d" -type f \( -iname '*.qbb' -o -iname '*.qbo' \) -exec cp -an {} "${p}/${n}" \; 
done

sleep 3
diskutil eject "$1"

osascript -e 'display notification "Insert another disk to start new search..." with title "QuickBooks File Recovery" subtitle "The find command has completed." sound name "Purr"

Obviamente, usted podría ser la inserción de los discos que usted no necesita o quiere buscar, así que usted puede utilizar la Carpeta de la Acción de Configuración para activar/desactivar fácilmente.

Puedo usar Spotlight para abrir la Carpeta de la Acción de Instalación y, a continuación, marque o desmarque las casillas de verificación según sea necesario.

Folder Action Setup

0voto

kenjikato Puntos 759

Yo era capaz de hacer que el script funcione correctamente con un par de pequeños cambios, y un par de complementos que se asegurará de que las cosas funcionen sin problemas

0voto

RSelec Puntos 1

OK. Me di cuenta de esto con la ayuda de @kenjikato.

@user3439894 señaló mi variable de escribir temas. Kenji, revisiones resuelve ese problema y sus informes adiciones me ayudó a solucionar más rápidamente y de manera productiva cuando el guión aún no pudo pasar de la primera entrada en la lista de la matriz.

Con la ayuda de nuestro amigo Google, uno de los arrojado errores me llevan a este documento que identifica el hecho de que applescript y bash encontrar no siempre juega muy bien, sobre todo cuando es re-activación de la orden a través de una repetición de un bucle.

Después de un par de intentos fallidos en la fijación de ese bucle, me preguntaba si la variable de tipificación de los problemas que causan otro enfoque que he probado, que fue el uso de la repetición del bucle para crear un único -iname cadena que contiene todos los tipos de archivo que se encuentran.

Así que, saqué el comando de bash y hacer script de shell fuera del bucle y luego se inyecta en mi bucle construido solicitud de archivo de la cadena en ella.

Problema resuelto!

Una vez tuve trabajo, he organizado y comentado mi código mejor, incluyendo el cambio de nombre de todas las variables para hacerlo más genérico (no sólo QuickBook archivos) y para hacer que las variables más descriptivo de lo que se captura para su uso.

Actualizado el código de abajo. Siéntase libre de usarlo!

Gracias por toda la ayuda!

#################################################
#   Search & Rescue Files on External Drives
#################################################
#   By Doug Daulton with Kenji Kato
#################################################
#   This script is called by an Automator
#   folder check on /Volumes
#
#   When a new volume is mounted the script:
#
#   1.  Creates a new folder on a target folder 
#       in the users home folder.
#
#   2.  Searches source drive for defined files
#       and copies them to the target folder.
#       
#       To configure, define these variables:
#           snrFileTypes
#           targetMasterFolder
#################################################

on adding folder items to thisFolder after receiving addedItems

    ###################################
    # Set Variables
    ###################################

    # Source Drive
    ###################################
    set sourceDriveName to item 1 of addedItems
    set sourcePath to POSIX path of sourceDriveName

    # File Types to Be "Rescued"
    ###################################
    set snrFileTypes to {"*qbb*", "*qbo*"}

    # Target Folder
    ###################################
    set targetMasterFolder to "00_QBB:"
    set targetMasterFolderPath to ((path to home folder as text) & targetMasterFolder)

    # Check that path has been set
    if not pathExists(targetMasterFolderPath) then
        display dialog "Master Target Folder does not exist. Files will not be copied."
        return
    end if

    # Create Target Folder
    ###################################
    set targetPath to targetMasterFolderPath & sourceDriveName
    set targetPath to POSIX path of targetPath
    set makeTargetFolder to "mkdir -p " & targetPath
    do shell script (makeTargetFolder)

    ###################################
    # Run The Search & Rescue
    ###################################
    try

        # Build snrFileTypesRequest
        ###################################

        # Initialize snrFileTypesRequest
        set snrFileTypeCurrent to (item 1 of snrFileTypes)
        set snrFileTypesRequest to "-iname \"" & snrFileTypeCurrent & "\""

        # Append snrFileTypesRequest until complete
        repeat with n from 2 to (count of snrFileTypes)
            set snrFileTypesCount to (count of snrFileTypes)
            set snrFileTypeCurrent to (item n of snrFileTypes)

            # Loop through snrFiletypes & append
            if (snrFileTypesCount > 1) then
                set snrFileTypesRequest to snrFileTypesRequest & " -o -iname \"" & snrFileTypeCurrent & "\""
            end if
        end repeat

        # Find & Copy Desired Files
        ###################################

        # inject snrFileTypesRequest into bash command
        set snrRescueOperation to "find " & sourcePath & " -type f \\( " & snrFileTypesRequest & " \\) -exec cp {} " & targetPath & " \\;"

        display dialog snrRescueOperation

        # execute the search & rescue (copy) via shell (Terminal) /bin/sh
        do shell script (snrRescueOperation)

        # Report Actionable Errors
        ###################################
        on error errStr number errorNumber
            display dialog "Could not copy files because " & errStr & " error# " & errorNumber
        return
    end try

end adding folder items to

#################################################
#   Path Check Subroutine
#################################################

on pathExists(targetMasterFolderPath) -- pathExists("path:to:folder: OR :file")
    try
        get targetMasterFolderPath as alias
        return true
    on error
        return false
    end try
end pathExists

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