¿Cómo puedo instalar este script como una acción de carpeta?

3

Estoy intentando configurar un script como una acción de carpeta que identificará y cambiará los caracteres no deseados en el nombre de un archivo agregado a una carpeta de destino.

La intención es hacer que esta automatización se ejecute como una acción de carpeta que debe leer el nombre de un archivo entrante o una nueva carpeta, buscar espacios y guiones y reemplazarlos con guiones bajos.

Esto es lo que tengo hasta ahora:

on adding folder items to theFolder after receiving theNewItems
    repeat with i from 1 to count of theNewItems
        set thisItem to item i of theNewItems
        tell application "Finder"
            set FileName to name of thisItem
        end tell
    end repeat
    set AppleScript's text item delimiters to {space, "-"}
    set FileName to the FileName's text items
    set AppleScript's text item delimiters to "_"
    set FileName to the FileName as text
end adding folder items to

¿Cómo puedo instalar este script como una acción de carpeta?

    
pregunta branarama 08.10.2018 - 22:37

1 respuesta

1

Esta respuesta es autocontenida como una solución a la pregunta anterior. Sin embargo, también sirve como una continuación de la pregunta anterior que se cerró , así que incorpora algunas de las solicitudes más amplias que se deseaban, como un diálogo de confirmación con la opción de editar el nombre de archivo y la opción de ignorar la validación y use un nombre de archivo de la elección del usuario.

on adding folder items to the |folder| after receiving filelist
    local folder, filelist

    tell application "Finder" to repeat with f in the filelist
        try
            set item f's name to my validate(item f's name)
        on error E
            display notification E with title my name
        end try
    end repeat
end adding folder items to
--------------------------------------------------------------------------------
to validate(filename)
    local filename

    script validation
        property old : filename

        on newFilename for old
            local old, new

            set tids to {¬
                {"_", space, "-"}, ¬
                {"_&_", "&"}, ¬
                {"and", "&"}, ""}
            set new to old

            repeat with tid in tids
                set new to text items of new as text
                set my text item delimiters to contents of tid
            end repeat

            new
        end newFilename

        on nameShowingErrors()
            set tids to {¬
                {" ͎", space}, ¬
                {"-͎", "-", "—"}, ¬
                {"&͎", "&"}, ""}
            set info to old as text

            repeat with tid in tids
                set info to text items of info as text
                set my text item delimiters to contents of tid
            end repeat

            info
        end nameShowingErrors

        to confirmRename()
            local new

            set [q, lf] to [quote, linefeed]

            tell (display dialog ["The following characters were", ¬
                " found in the filename: ⟨space⟩, \"-\" ", ¬
                " ⟨hyphen⟩ \"&\" ⟨ampersand⟩", lf, lf, ¬
                " Filename: ", q, nameShowingErrors(), q, ¬
                lf, lf, "By default, these characters will", ¬
                " be replaced with underscores.", ¬
                " Alternatively, you can make your own edits", ¬
                " below and revalidate the filename again."] ¬
                as text ¬
                with title ("Validate Filename") ¬
                default answer (newFilename for old) ¬
                buttons ["Rename", "Keep This Name"] ¬
                default button 1 ¬
                with icon (path to resource ("Finder.icns") ¬
                in bundle application "Finder")) to if ¬
                "Rename" = its button returned ¬
                then return its text returned

            false
        end confirmRename
    end script

    tell validation
        if filename = (newFilename for filename) then return filename
        set newName to confirmRename()
        if newName = false then return its old
        if newName ≠ (newFilename for newName) ¬
            then return validate(newName)
        newName
    end tell
end validate

Mientras este script funciona, debo recordarte el comentario que dejé en contra de tu pregunta original, que ha sido reiterado anteriormente por otro usuario: este script tiene el potencial de ser llamado dos veces para un solo archivo porque cambiar el nombre de los archivos mientras están Dentro de la carpeta que se está viendo se activa la acción de la carpeta nuevamente. Esto sucede cuando el usuario elige editar el nombre de archivo sugerido y proporciona un nombre no válido. La secuencia de comandos solicitará que se valide el nuevo nombre de archivo al mostrar el cuadro de diálogo por segunda vez (hasta ahora, todo esto es normal, y todo lo que debería suceder). Sin embargo, cuando el usuario selecciona ignorar los criterios de denominación y utiliza este nombre de todos modos, el nombre del archivo se renombra y el script se vuelve a activar. Esto abre el cuadro de diálogo por tercer tiempo, que no es lo que queremos que ocurra idealmente, pero es inevitable.

(Esto no es un problema cuando se cambia el nombre de los archivos a un nombre de archivo validado, ya que el script, aunque se ejecuta dos veces, no hace nada por los nombres de archivos que no requieren cambio).

Por el motivo anterior, le aconsejaría que considere implementar la acción de su carpeta de manera ligeramente diferente y que los archivos se muevan a una nueva carpeta de salida antes de que se les cambie el nombre. Esto es muy fácil de hacer agregando una línea antes de set item f's name to... que se parece a esto:

move item f to the outputFolder

donde habrá definido outputFolder como property o una variable al inicio del script que apunta a la ubicación donde existe la carpeta de salida (preferiblemente como alias ), por ejemplo:

set outputFolder to POSIX file "/Users/%you%/My Watched Folder/Processed Files" as alias

Pero, por ahora, he escrito el guión para hacer lo que querías. Supongo que no habrá muchos casos en los que desees ignorar tus propios criterios de nomenclatura, por lo que es posible que el fenómeno de "tres diálogos" nunca surja, o que sea poco molesto cuando lo haga.

Para instalar un script como acción de carpeta , lo dirigiré a la primera parte de mi respuesta anterior, que he transferido a continuación.

Acciones de carpeta

Una acción de carpeta se puede crear de dos maneras: a través de Automator , o por medio de un script de acción de carpeta .

Paraobtenerinformaciónsobrecómocrearunscriptdeaccióndecarpeta,quediríaqueesprobablementelasoluciónmásadecuadaenestecaso,puedeleerelMac Automation Scripting Guide - Observando las carpetas , que detalla cómo hacer esto.

La sección titulada Adjuntar un guión de acción de carpeta a una carpeta es la más pertinente para la tarea.

    
respondido por el CJK 09.10.2018 - 11:01

Lea otras preguntas en las etiquetas