¿Es posible que un archivo .scpt de AppleScript conserve un icono personalizado, incluso después de que se hayan realizado modificaciones en el código?

El archivo:

Creé un archivo AppleScript .scpt en Script Debugger.app.

Así es como asigné un ícono personalizado a este archivo .scpt:

  • Descargué un ícono único (en el formato "512px PNG") de IconArchive.com .

  • Abrí el archivo .png con Preview.app. En Vista previa, hice clic en EditCopypara colocar esta imagen en mi portapapeles.

  • Abrí la Get Infoventana del archivo .scpt en Finder. Hice clic izquierdo en el icono predeterminado, que se encuentra en la esquina superior izquierda de la Get Infoventana. A continuación, apareció un contorno azul alrededor del icono predeterminado, lo que refleja que se seleccionó el icono.

  • Finalmente, pegué el ícono personalizado sobre el ícono predeterminado a través del atajo de teclado, ⌘ command+ V. El icono personalizado se configuró de inmediato. Cerré por la Get Infoventana.


El bicho:

Cuando abro el archivo .scpt en Script Debugger, para editar el código y luego vuelvo a guardar el archivo .scpt, el ícono personalizado desaparece.

Al guardar, el siguiente icono ocupa inmediatamente el lugar del icono personalizado:

(Este es el ícono predeterminado de OS X para archivos .scpt).

Por supuesto, tener que pasar por el proceso de configurar el ícono personalizado cada vez que guardo (es decir, edito) el archivo es un inconveniente.

Pero también hay un segundo error corolario: cada vez que vuelvo a agregar el icono personalizado en la Get Infoventana, el tamaño del archivo .scpt aumenta acumulativamente. En otras palabras, cuando Script Debugger elimina el icono del archivo personalizado, el tamaño del archivo del icono todavía se incluye, de alguna manera, como parte del tamaño general del archivo .scpt.

Caso en cuestión: el tamaño del archivo .scpt en cuestión es de 12,6 MB, en este momento. El archivo no debe tener más de 0,5 MB.


La pregunta:

Entiendo cómo configurar un ícono de archivo personalizado en un archivo AppleScript .app , de modo que este ícono personalizado permanezca en su lugar después de la edición , pero tengo curiosidad por saber si se puede hacer lo mismo para un archivo .scpt.

¿Hay alguna forma de que mi ícono de secuencia de comandos personalizada permanezca en su lugar, incluso después de que el archivo .scpt se haya modificado en el depurador de secuencias de comandos?

Este es un archivo .scpt que se inicia a través del menú desplegable de la barra de menú FastScripts.app. (El archivo .scpt se encuentra en /Users/Me/Library/Scripts.) El menú desplegable FastScripts en realidad muestra los íconos de archivo de los scripts , lo cual es una buena característica. Esta es la razón por la que quiero establecer un ícono personalizado en el archivo .scpt (es decir, para poder observar un ícono apropiado en el menú contextual de FastScripts).

No, no es un gran problema simplemente convertir los archivos .scpt de AppleScript que quiero que tengan un icono de archivo personalizado en archivos .app de AppleScript. Hago esta pregunta solo para ver si hay algo que me estoy perdiendo o pasando por alto aquí.


¿ Qué pasa con el Editor de secuencias de comandos ?

Parece que este error es exclusivo de Script Debugger .

Cuando sigo los mismos pasos en el programa de edición nativo de AppleScript de OS X, Script Editor.app , el ícono del archivo .scpt permanece intacto, al guardar. Sin embargo, podría haber jurado que, de hecho, experimenté este problema en el Editor de secuencias de comandos en el pasado.

Por ejemplo, recuerdo que, una vez, Script Editor se negó a guardar un archivo .scpt que yo había editado; se presentó un cuadro de diálogo de error vago en Guardar. Para guardar correctamente el archivo, tuve que eliminar el icono personalizado de la Get Infoventana del Finder o copiar el texto del código y pegarlo en un nuevo archivo .scpt (que, por supuesto, necesariamente tendría el icono de archivo .scpt predeterminado).

Pero, en este momento, ya no puedo reproducir el error en el Editor de secuencias de comandos.

En cualquier caso, trato de no usar el Editor de secuencias de comandos para editar mis AppleScripts nunca más. Esto se debe a que el Editor de secuencias de comandos es lento , puede fallar al usar una biblioteca de secuencias de comandos de terceros y puede ser temperamental cuando se trata de abrir y guardar archivos.

En mi experiencia, hasta ahora, Script Debugger no tiene ninguno de estos problemas.

Por supuesto, Script Debugger tiene al menos un problema (es decir, el problema detallado en esta publicación).


OS X El Capitán, versión 10.11.6.


"Por supuesto, tener que pasar por el proceso de configurar el ícono personalizado cada vez que guardo (es decir, edito) el archivo es un inconveniente". Podrías escribir un Script para que lo haga por ti. Como usted dice, Script Editor mantiene íconos personalizados entre guardados de archivos .scpt.
Escribiste: "Como dices, Script Editor mantiene íconos personalizados entre guardados de archivos .scpt". Pero, no veo cómo esto es algo bueno o útil. Quiero decir, ¿cómo accedo al ícono personalizado después de guardar? Veo este comportamiento como algo malo, porque sigue aumentando el tamaño del archivo .scpt, indefinidamente, sin ningún beneficio o propósito. Si hago lo que sugiere y creo un AppleScript dedicado que establece el ícono de archivo del archivo .scpt como un ícono personalizado, el tamaño del archivo del archivo .scpt seguirá aumentando cada vez más, cada vez que el ícono personalizado Está establecido.
Si mantiene el antiguo ícono personalizado, puede hacer un corte en el portapapeles.
Sigo sin entender tu sugerencia. Al guardar el archivo .scpt, el ícono personalizado desaparece inmediatamente. ¿Cómo puede cortar el icono personalizado en el portapapeles, después de que ya se haya sobrescrito con el icono de archivo predeterminado?

Respuestas (2)

En términos generales, cuando un usuario asigna un icono personalizado a un archivo copiando y pegando un archivo de imagen en el icono, en la esquina superior izquierda, en la hoja Obtener información del archivo, el archivo de imagen se almacena como un com.apple.ResourceFork atributo extendido del archivo al que pertenece. aplicado y se puede ver en la Terminal usando ls -l@ filename.extpara mostrar que el archivo tiene atributos extendidos . Para manipular los atributos extendidos , use la xattrutilidad en Terminal. Tenga en cuenta que el uso del término archivo de imagen en este contacto es cualquier fuente válida copiada en el Portapapeles para luego pegarse en la hoja Obtener información.

Tener que volver a aplicar el archivo de icono después de haber guardado el archivo .scpt en Script Debugger hace que el com.apple.ResourceFork atributo extendido continúe creciendo en tamaño, mientras que posiblemente pierda el acceso a los archivos de icono acumulados, no puedo decirlo con seguridad porque no he hecho lo suficiente. pruebas. Desafortunadamente, aunque Script Editor mantiene el archivo de icono personalizado, parece que también aumenta el tamaño del com.apple.ResourceFork atributo extendido .

Para reducir el tamaño del archivo eliminando específicamente los com.apple.ResourceFork atributos extendidos , use la siguiente sintaxis de comando en la Terminal:

xattr -d com.apple.ResourceFork filename.ext

Luego vuelva a aplicar el icono personalizado al archivo.

Eche un vistazo a la página de manual de xattrTerminal escribiendo xattry luego haga clic con el botón derecho en ella seleccionando Abrir página de manual en el menú contextual.

El problema con el restablecimiento del depurador de scripts al ícono predeterminado probablemente tendrá que abordarse con el desarrollador, o usar la solución alternativa sugerida en la respuesta de wch1zpink.

Dado que el com.apple.ResourceFork atributo extendido crece independientemente de las aplicaciones que use, Editor de secuencias de comandos o Depurador de secuencias de comandos, este es un problema que Apple debe abordar.

Sé que está utilizando OS X El Capitan 10.11.6, sin embargo, lo probé en macOS Sierra 10.12.5 y el comportamiento aparentemente es el mismo, probablemente no importe que lo haya probado en una versión posterior del sistema operativo. Estaba usando Script Debugger 6.0.4.

Debido a la repetitividad de lo que está haciendo, aquí se necesita una solución con secuencias de comandos para reducir el esfuerzo necesario para mantener un tamaño de archivo pequeño, incluidos sus atributos extendidos , y el icono personalizado.


Actualizar:

Después de haber seguido un camino similar, en OS X 10.8.5, con la configuración programática del ícono de un archivo y después de haber probado casi todas las soluciones presentadas en ¿Cómo puedo cambiar un ícono de archivo o carpeta usando la Terminal ? Elegí usar setfileicon de esta respuesta , ya que redactó lo mejor para mis necesidades en ese momento.

El siguiente código AppleScript es un código de ejemplo que puede eliminar mediante programación el com.apple.ResourceFork atributo extendido del archivo de destino para reducir su tamaño acumulativo y restablecer el icono del archivo de destino. Está escrito sobre el uso de la solución alternativa sugerida en la respuesta de wch1zpink, que hace referencia al bloqueo del archivo para mantener el ícono intacto durante un guardado en Script Debugger.

El objetivo principal de este código de ejemplo es mostrar cómo eliminar el com.apple.ResourceFork atributo extendido del archivo de destino y restablecer su icono personalizado mediante programación. He incluido el código para desbloquear/bloquear el archivo de destino si elige usar ese método para mantener el ícono intacto entre guardados, si no, puede eliminarse. Supongo que solo depende de la frecuencia con la que desee restablecer el tamaño del com.apple.ResourceFork atributo extendido del archivo de destino .

tell current application

    set theTargetFilename to "filename.scpt" as string
    set theHomeFolderPath to (path to home folder) as string
    set theScriptsFolder to (path to scripts folder) as string
    set theTargetFilePathname to theScriptsFolder & theTargetFilename as alias
    set theTargetIcon to quoted form of (POSIX path of (theHomeFolderPath & "bin:icon.icns") as string)
    set theTargetExecutable to quoted form of (POSIX path of (theHomeFolderPath & "bin:setfileicon") as string)

    tell application "Finder" to set locked of theTargetFilePathname to false
    do shell script "xattr -d com.apple.ResourceFork " & quoted form of (POSIX path of theTargetFilePathname) & "; exit 0"
    do shell script theTargetExecutable & " " & theTargetIcon & " " & quoted form of (POSIX path of theTargetFilePathname)
    tell application "Finder" to set locked of theTargetFilePathname to true

end tell

Notas:

A los efectos de este código de ejemplo, he colocado la setfileiconutilidad de línea de comandos y icon.icnslos archivos de destino en la carpeta bin dentro de la raíz de mi carpeta de inicio . El icon.icnsarchivo es el archivo .icns del vinculado en su pregunta. Puede usar el archivo PNG , sin embargo, creo que el archivo .icns produce una mejor imagen.

El script podría estar más codificado y no tan detallado, sin embargo, lo codifiqué de esta manera por algunas razones de las cuales no voy a entrar en detalles a menos que necesite una explicación. Siéntase libre de utilizar el código de ejemplo para implementar una solución funcional según sea necesario o deseado en su entorno.

Esto se probó en macOS Sierra 10.12.5, sin embargo, también debería funcionar en OS X El Capitan 10.11.6.

Brillante. Especialmente el "conjunto bloqueado" ;-)
@wch1zpink, El crédito por bloquear el archivo para mantener intacto el ícono personalizado al guardar con Script Debugger, como solución alternativa, es todo suyo (¡y necesito hacer +1 en su respuesta para eso)! ¡Pero qué problema tan desagradable con el atributo extendido com.apple.ResourceFork que sigue creciendo! Al menos entre nuestras dos respuestas, hay una solución para manejar ambos problemas.
De hecho, estaba en las páginas de manual de xattr y estaba aprendiendo y leyendo. Solo he estado escribiendo guiones durante aproximadamente ocho meses, sin ninguna habilidad de programación en mi haber antes de esto. Tanto que aprender. Honestamente, sus respuestas y respuestas me han enseñado mucho. gracias amigo
También estaba leyendo la página de manual de iconset, verificando si había algún comando que pudiéramos usar. Cosas interesantes
Hecho magistralmente . Su código se encarga perfectamente de ambos errores. ¡Gracias por tu ingenio! ¡Gracias también, @wch1zpink! Esta respuesta es una obra de arte.
@ user3439894 Aquí hay un pensamiento/pregunta. ¿Podría su secuencia de comandos guardarse como un controlador simplemente agregando la parte superior e inferior de su secuencia de comandos ... en deleteResourceFork() -- su secuencia de comandos finaliza deleteResourceFork y agregando el valor de "filename.scpt" como una variable? Porque sé que el editor de scripts y el depurador de scripts permiten guardar texto en otros archivos. De esta manera, todo lo que debe hacerse, en cualquier secuencia de comandos nueva creada en el depurador de secuencias de comandos, sería simplemente agregar una propiedad para cargar el archivo de secuencia de comandos (su secuencia de comandos) y luego llamar a ese controlador en cualquier momento que desee.
@wch1zpink, idea interesante, sin embargo, tenga en cuenta que obviamente solo desea que esto ocurra en una secuencia de comandos/aplicación de AppleScript guardada que tenga un ícono personalizado agregado de la manera mencionada, ya que esa es la única vez que el atributo extendido del archivo de com.apple.ResourceFork destino es aumentado innecesariamente de tamaño. Como tal, incorporar esto en el código de una secuencia de comandos/aplicación no va a hacer nada de valor ya que no existe ningún mecanismo, que yo sepa, desde el Depurador de secuencias de comandos o el Editor de secuencias de comandos, para activar el código solo en la secuencia de comandos/ aplicación que tiene un icono personalizado después de guardarse en cualquiera de las dos aplicaciones.
Es 2021 ahora, ¿alguna actualización de esto?

En realidad hay una solución. Descargué el archivo .icns desde el enlace que proporcionó. Luego arrastré todo el archivo .icns desde la ventana del Finder hasta la imagen del ícono en la ventana Obtener información del script que creé en la aplicación Script Debugger. Después de configurar el nuevo ícono, seleccioné la opción para "bloquear archivo" en la ventana Obtener información.

ingrese la descripción de la imagen aquí

Después de esto, abrí ese script nuevamente en la aplicación Script Debugger e hice algunos cambios en el script, volví a compilar el script y lo volví a guardar. Cuando intenté guardarlo de nuevo, recibí esta ventana de mensaje.

ingrese la descripción de la imagen aquí

¡Seleccioné la opción "Guardar Ayway" y BINGO! Las ediciones se guardaron pero el ícono personalizado permaneció sin cambios.


Aquí hay una sugerencia de que tal vez alguien pueda agarrar la pelota y correr con ella. En lugar de guardarlo como un archivo de secuencia de comandos en el depurador de secuencias de comandos, guárdelo como un paquete de secuencias de comandos (.scptd). Después de hacer esto, ctrl + clic en ese archivo en el buscador y seleccione "Mostrar contenido del paquete". Agregue su archivo .icns personalizado a la carpeta Recursos. También notará un archivo info.plist. Abra el archivo info.plist en Xcode. Si presiona el botón + en la fila de la lista de propiedades de información, le da la opción de agregar archivos de iconos.

ingrese la descripción de la imagen aquí

Esto está por encima del alcance de mi conocimiento, pero tal vez de alguna manera el archivo de iconos personalizados se pueda configurar aquí.

Esa es una solución interesante para Script Debugger que no restablece el ícono personalizado, pero desafortunadamente el com.apple.ResourceFork atributo extendido del archivo continúa creciendo cada vez que se guarda. Por lo tanto, periódicamente será necesario eliminar el com.apple.ResourceFork atributo extendido y restablecer el icono. El archivo deberá estar desbloqueado para hacer esto, ya que incluso el uso sudono evitará el bloqueo.
No creo que un paquete de documentos admita una propiedad de archivo Icon en Info.plist, pero los paquetes de aplicaciones sí lo hacen.
Creo que tiene razón en esa observación porque hice los ajustes necesarios en el archivo plist, en el paquete de documentos, pero no mantuvieron el icono personalizado si abro el .scptd en el depurador de secuencias de comandos nuevamente y hago y guardo los cambios.