4 votos

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

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

La intención es que esta automatización se ejecute como una acción de carpeta que debería leer el nombre de un archivo entrante o de una nueva carpeta, comprobar si hay espacios y guiones, y sustituirlos por 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?

0 votos

Como dijo CJK en su otra pregunta, ya cerrada, "Un obstáculo importante al que se enfrentará es el cambio de nombre de un archivo o carpeta dentro de la carpeta vigilada. Esto activará su script una segunda vez, ya que un cambio de nombre es esencialmente la creación de un nuevo archivo/carpeta". Los elementos que se colocan en una carpeta vigilada se supone que actúan y se mueven fuera de la carpeta vigilada a una carpeta diferente. Dependiendo de lo que ocurra, la carpeta a la que se mueven los elementos puede estar dentro o fuera de la carpeta vigilada. ¿Cómo piensa manejar si un nombre de elemento ya existe en el proceso de renombramiento?

0 votos

@user3439894 Además de ser ineficiente, ¿qué problema hay en que se ejecute una segunda vez?

1voto

qarma Puntos 71

Esta respuesta es autosuficiente como solución a la pregunta anterior. Sin embargo, también sirve como continuación a la pregunta anterior que se cerró Así que incorpora algunas de las peticiones más amplias que se querían, como un diálogo de confirmación con la opción de editar el nombre del archivo, y la opción de ignorar la validación y utilizar 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

Aunque este script funciona, debo recordarle el comentario que dejé contra su pregunta original, y que ha sido reiterado más arriba por otro usuario: este script tiene el potencial de ser llamado dos veces para un solo archivo porque el renombramiento de archivos mientras están dentro de la carpeta que se está vigilando desencadena la acción de la carpeta de nuevo. Esto sucede cuando el usuario elige editar el nombre de archivo sugerido y proporciona un nombre no válido. El script pedirá que se valide el nuevo nombre de archivo mostrando el cuadro de diálogo una segunda vez (hasta ahora, todo esto es normal, y totalmente lo que debería suceder). Sin embargo, cuando el usuario selecciona ignorar los criterios de nomenclatura y utilizar este nombre de todos modos, el archivo es renombrado y el script se activa de nuevo. Esto hace que aparezca el diálogo para un tercera tiempo, que no es lo que queremos que ocurra idealmente, pero es inevitable.

(Esto no es un problema cuando los archivos son renombrados a un nombre de archivo validado, ya que el script-aunque se ejecuta dos veces independientemente-no hace nada para los nombres de archivo que no requieren ser cambiados).

Por la razón anterior, le aconsejo que considere la posibilidad de implementar su acción de carpeta de forma ligeramente diferente, y que los archivos se muevan a una nueva carpeta de salida antes de ser renombrados. Esto es muy fácil de hacer añadiendo 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 apunte a la ubicación de donde existe la carpeta de salida (preferiblemente como un alias ), por ejemplo

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

Pero, por ahora, he escrito el script para hacer lo que querías. Asumo que no va a haber muchos casos en los que quieras ignorar tu propio criterio de nomenclatura, así que el fenómeno de "tres diálogos" puede no surgir nunca, o ser poco más que molesto cuando lo haga.


Para instalar un script como acción de la carpeta En este caso, le remito a la primera parte de mi respuesta anterior, que he trasladado a continuación.

Acciones de la carpeta

Una acción de carpeta puede crearse de dos maneras: mediante Automatizador o por medio de un acción de carpeta script .

Automator on macOS

Para obtener información sobre cómo crear un acción de carpeta script que yo diría que es probablemente la solución más adecuada en este caso, es posible que desee leer el Guía de scripting para la automatización de Mac - Vigilancia de carpetas que detalla cómo hacerlo.

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

0 votos

@branarama, ¿cómo te ha ido con esto?

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