Me he encontrado con un problema particular con un guión 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, el alias de ese archivo aún se puede direccionar desde AppleScript después de agregar el prefijo al archivo. El siguiente código funciona en ALGUNAS máquinas pero no en otras. Lo probé en un MBP 2018 con 10.13, un Mac Mini 2012 con 10.13 y un iMac 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 trato de convertir el alias en una ruta posix. En las máquinas en las que funciona este script, el cuadro de diálogo de visualización de prueba enumera el alias de archivo con el nuevo nombre. Entonces foo.txt se convierte en temp_foo.txt. En las máquinas en las que falla el script, el cuadro de diálogo de visualización vuelve con solo foo.txt como nombre de archivo.
En la máquina en la que esto está fallando, el archivo se renombrará como temp_foo.txt como debería ser, pero el alias nunca se actualiza, por lo que todavía cree que el archivo es solo foo.txt. En las máquinas que fallan, el último comando para establecer la variable en la ruta posix del alias falla porque el alias es incorrecto ya que todavía apunta al nombre de archivo anterior.
Si es necesario, simplemente cambiaré el nombre de todos los archivos en un ciclo, luego regresaré y obtendré las rutas posix en otro ciclo, ya que hago un nuevo
set theTempFiles to files of (item 1 of theSelection)
Debería obtener una nueva lista de archivos, ahora con su prefijo "temp_". Pero me duele poner un ciclo de repetición que no creo que sea realmente necesario ya que el código funciona MUY BIEN en algunas máquinas.
¿Quién puede ayudarme a hacer que mi código funcione bien y quién puede hacer que falle? Solo me gustaría ver qué tan grande es este problema. También sería bueno si alguien pudiera decirme que estoy haciendo algo terriblemente mal en mi código, y que es por eso que obtengo resultados impredecibles.
Creo que se rompió en alguna parte, ya que alias
se supone que es una referencia a un elemento de archivo que sigue siendo válido incluso si se cambia el nombre o se mueve. Si va a usar rutas POSIX de todos modos, puede usar NSURL
la clase de Cocoa (a través de AppleScriptObjC) para realizar un seguimiento de las referencias del archivo, ya que eso es lo que se usa en última instancia (o se supone que se usa).
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
micro solar
Chris normando
amenaza_roja
alias
es una referencia al archivo que no cambiará incluso si se mueve o se le cambia el nombre, pero parece que se rompió en alguna parte. Si en última instancia va a utilizar rutas POSIX, puede considerar el uso de NSURL a través de AppleScriptObjC.Chris normando
amenaza_roja