0 votos

Problemas con Applescript al renombrar un archivo y conseguir que el alias cambie también su nombre

Me he encontrado con un problema particular con un script más grande que estoy escribiendo. Estoy tratando de cambiar el nombre de todos los archivos en una carpeta con un prefijo de "temp_" y, al hacerlo, tener el alias de ese archivo todavía se puede abordar desde AppleScript después de que el prefijo se ha añadido al archivo. El siguiente código funciona en ALGUNAS máquinas pero no en otras. Lo he probado en un MBP de 2018 con 10.13, en un Mac Mini de 2012 con 10.13 y en un iMac de 2015 con 10.13 y 10.14. El iMac es la única máquina que tiene problemas con este código:

tell application "Finder"
set theSelection to the selection -- so you must have a folder with files selected in Finder before running this code.
set theFiles to the files of (item 1 of theSelection) --get the files
end tell
repeat with f from 1 to (count theFiles)
    set aItem to item f of theFiles -- set a variable as an individual file
    set pdfName to name of aItem --get the name of that file
    set aliasItem to aItem as alias -- get the alias of the file
    tell application "Finder"
        set the name of aliasItem to (("temp_" & (name of aliasItem)) as string) --rename the file
    end tell
    display dialog (aliasItem as string) buttons {"Cancel", "OK"} default button "OK" --this is just here for testing the script, to see what the system still thinks the file is named
    set posixPath to (POSIX path of aliasItem) --THIS is where the code fails on some machines. 
end repeat

El código falla en ALGUNAS máquinas cuando intento convertir el alias en una ruta posix. En las máquinas en las que este script funciona, el diálogo de visualización de la prueba muestra el alias del archivo con el nuevo nombre. Así, foo.txt se convierte en temp_foo.txt. En las máquinas en las que el script falla, el diálogo de visualización vuelve a mostrar sólo foo.txt como nombre de archivo.

En la máquina en la que esto está fallando, el archivo será renombrado temp_foo.txt como debería ser, pero el alias nunca se actualiza, así que todavía piensa que el archivo es simplemente foo.txt. En las máquinas que fallan, el último comando para establecer la variable a la ruta posix del alias falla porque el alias es incorrecto ya que sigue apuntando al antiguo nombre del archivo.

Si es necesario, simplemente cambiaré el nombre de todos los archivos en un bucle, y luego volveré y obtendré las rutas posix en otro bucle, ya que al hacer un nuevo

set theTempFiles to files of (item 1 of theSelection)

Debería obtener una nueva lista de los archivos, ahora con su prefijo "temp_". Pero me duele poner un bucle de repetición que no creo que sea realmente necesario ya que el código funciona BIEN en algunas máquinas.

¿Quién puede ayudarme a que mi código funcione bien y quién puede hacer que falle? Me gustaría ver la magnitud del problema. También sería bueno si alguien pudiera decirme que estoy haciendo algo terriblemente mal en mi código, y es por eso que estoy recibiendo resultados impredecibles.

1voto

red_menace Puntos 111

Creo que se rompió en alguna parte, como un alias se supone que es una referencia a un elemento de archivo que sigue siendo válido incluso si se renombra o se mueve. Si vas a utilizar rutas POSIX de todos modos, podrías echar un vistazo al uso de Cocoa NSURL (a través de algún AppleScriptObjC) para hacer un seguimiento de las referencias a los archivos, ya que eso es en última instancia lo que se está utilizando (o se supone que se utiliza).

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

tell application "Finder" -- get the selection
    set theSelection to selection
    set theFiles to the files of (first item of theSelection) as alias list
end tell

repeat with anItem in theFiles
    set anItem to POSIX path of anItem
    set fileRefURL to (current application's NSURL's fileURLWithPath:anItem)'s fileReferenceURL() -- get file reference from path
    tell application "System Events" to set the name of disk item anItem to "temp_" & (name of disk item anItem)
    set posixPath to (fileRefURL's |path|()) as text -- get path from file reference
    display dialog "Before:" & return & anItem & return & return & "After:" & return & posixPath buttons {"Cancel", "OK"} default button "OK"
end repeat

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