Ist es möglich, dass eine AppleScript-.scpt-Datei ein benutzerdefiniertes Symbol behält, selbst nachdem Änderungen am Code vorgenommen wurden?

Die Datei:

Ich habe eine AppleScript .scpt-Datei in Script Debugger.app erstellt.

So habe ich dieser .scpt-Datei ein benutzerdefiniertes Symbol zugewiesen:

  • Ich habe ein einzigartiges Symbol (im "512px PNG"-Format) von IconArchive.com heruntergeladen .

  • Ich habe die .png-Datei mit Preview.app geöffnet. In der Vorschau habe ich auf Edit⟶ geklickt Copy, um dieses Bild in meine Zwischenablage zu legen.

  • Ich habe das Fenster der .scpt-Datei Get Infoim Finder geöffnet. Ich habe mit der linken Maustaste auf das Standardsymbol geklickt, das sich in der oberen linken Ecke des Get InfoFensters befindet. Um das Standardsymbol herum wurde dann eine blaue Umrandung angezeigt, die anzeigt, dass das Symbol ausgewählt wurde.

  • ⌘ commandSchließlich habe ich das benutzerdefinierte Symbol über die Tastenkombination + über das Standardsymbol eingefügt V. Das benutzerdefinierte Symbol wurde sofort festgelegt. Ich schloss aus dem Get InfoFenster.


Der Fehler:

Wenn ich die .scpt-Datei in Script Debugger öffne, um den Code zu bearbeiten, und dann die .scpt-Datei erneut speichere, verschwindet das benutzerdefinierte Symbol.

Beim Speichern tritt das folgende Symbol sofort an die Stelle des benutzerdefinierten Symbols:

(Dies ist das Standardsymbol von OS X für .scpt-Dateien.)

Natürlich ist es eine Unannehmlichkeit, jedes Mal, wenn ich die Datei speichere (dh bearbeite), den Prozess des Festlegens des benutzerdefinierten Symbols durchlaufen zu müssen.

Aber es gibt auch einen zweiten Folgefehler: Jedes Mal, wenn ich das benutzerdefinierte Symbol im Fenster neu hinzufüge Get Info, erhöht sich die Dateigröße der .scpt-Datei kumulativ. Mit anderen Worten, wenn der Skript-Debugger das benutzerdefinierte Dateisymbol löscht, ist die Dateigröße des Symbols irgendwie immer noch als Teil der Gesamtgröße der .scpt-Datei enthalten.

Ein typisches Beispiel: Die Dateigröße der betreffenden .scpt-Datei beträgt derzeit 12,6 MB. Die Datei sollte nicht größer als 0,5 MB sein.


Die Frage:

Ich verstehe, wie man ein benutzerdefiniertes Dateisymbol auf eine AppleScript -.app-Datei setzt , sodass dieses benutzerdefinierte Symbol nach der Bearbeitung an Ort und Stelle bleibt , aber ich bin gespannt, ob dasselbe für eine .scpt-Datei getan werden kann.

Gibt es eine Möglichkeit, dass mein benutzerdefiniertes Skriptsymbol an Ort und Stelle bleibt, auch nachdem die .scpt-Datei im Skript-Debugger geändert wurde?

Dies ist eine .scpt-Datei, die über das Dropdown-Menü der FastScripts.app-Menüleiste gestartet wird. (Die .scpt-Datei befindet sich in /Users/Me/Library/Scripts.) Das FastScripts-Dropdown-Menü zeigt tatsächlich die Dateisymbole der Skripte an , was eine nette Funktion ist. Aus diesem Grund möchte ich ein benutzerdefiniertes Symbol für die .scpt-Datei festlegen (dh damit ich ein passendes Symbol im Kontextmenü von FastScripts sehen kann).

Nein, es ist keine große Sache, einfach die AppleScript-.scpt-Dateien, die ein benutzerdefiniertes Dateisymbol haben sollen, in AppleScript-.app-Dateien zu konvertieren. Ich stelle diese Frage nur, um zu sehen, ob ich hier etwas vermisse oder übersehe.


Was ist mit dem Skripteditor ?

Es scheint, dass dieser Fehler nur im Script Debugger auftritt .

Wenn ich die gleichen Schritte im nativen AppleScript-Bearbeitungsprogramm von OS X, Script Editor.app , befolge, bleibt das .scpt-Dateisymbol beim Speichern erhalten. Ich hätte jedoch schwören können , dass ich dieses Problem in der Vergangenheit tatsächlich im Skripteditor erlebt habe.

Ich erinnere mich zum Beispiel daran, dass sich der Skripteditor einmal geweigert hat, eine von mir bearbeitete .scpt-Datei zu speichern; Beim Speichern wurde ein vager Fehlerdialog angezeigt. Um die Datei erfolgreich zu speichern, musste ich entweder das benutzerdefinierte Symbol aus dem Finder- Get InfoFenster löschen oder den Codetext kopieren und in eine neue .scpt-Datei einfügen (die natürlich zwangsläufig das standardmäßige .scpt-Dateisymbol besitzen würde).

Aber zu diesem Zeitpunkt kann ich den Fehler im Skripteditor nicht mehr reproduzieren.

Jedenfalls versuche ich, meine AppleScripts nicht mehr mit dem Skripteditor zu bearbeiten. Dies liegt daran, dass der Skripteditor verzögert ist , möglicherweise abstürzt, wenn eine Skriptbibliothek eines Drittanbieters verwendet wird , und beim Öffnen und Speichern von Dateien temperamentvoll sein kann.

Nach meiner bisherigen Erfahrung hat Script Debugger keines dieser Probleme.

Natürlich hat der Skript-Debugger jedoch mindestens ein Problem (dh das in diesem Beitrag beschriebene Problem).


OS X El Capitan, Version 10.11.6.


„Natürlich ist es eine Unannehmlichkeit, jedes Mal, wenn ich die Datei speichere (dh bearbeite), den Prozess des Festlegens des benutzerdefinierten Symbols durchlaufen zu müssen.“ Sie könnten ein Skript schreiben, das dies für Sie erledigt. Wie Sie sagen, behält der Skripteditor benutzerdefinierte Symbole zwischen dem Speichern von .scpt-Dateien bei.
Sie haben geschrieben: "Wie Sie sagen, behält der Skripteditor benutzerdefinierte Symbole zwischen dem Speichern von .scpt-Dateien bei." Aber ich verstehe nicht, wie das gut oder nützlich sein soll? Ich meine, wie greife ich nach dem Speichern auf das benutzerdefinierte Symbol zu? Ich sehe dieses Verhalten als eine schlechte Sache an, weil es die Dateigröße der .scpt-Datei auf unbestimmte Zeit ohne Nutzen oder Zweck erhöht. Wenn ich das tue, was Sie vorschlagen, und ein dediziertes AppleScript erstelle, das das Dateisymbol der .scpt-Datei als benutzerdefiniertes Symbol festlegt, würde die Dateigröße der .scpt-Datei jedes Mal größer und größer werden, wenn das benutzerdefinierte Symbol verwendet wird eingestellt ist.
Wenn das alte benutzerdefinierte Symbol beibehalten wird, können Sie einen Schnitt in die Zwischenablage kopieren.
Ich verstehe deinen Vorschlag immer noch nicht. Nach dem Speichern der .scpt-Datei verschwindet das benutzerdefinierte Symbol sofort. Wie können Sie das benutzerdefinierte Symbol in die Zwischenablage ausschneiden, nachdem es bereits mit dem Standarddateisymbol überschrieben wurde?

Antworten (2)

Wenn ein Benutzer einer Datei ein benutzerdefiniertes Symbol zuweist, indem er eine Bilddatei in das Symbol in der linken oberen Ecke auf dem Informationsblatt der Datei kopiert und einfügt , wird die Bilddatei im Allgemeinen als com.apple.ResourceFork erweitertes Attribut der Datei gespeichert, die es ist angewendet auf und kann im Terminal mit angezeigt werden, ls -l@ filename.extum anzuzeigen, dass die Datei erweiterte Attribute hat . Um die erweiterten Attribute zu bearbeiten , verwenden Sie das xattrDienstprogramm in Terminal. Beachten Sie, dass die Verwendung des Begriffs Bilddatei in diesem Kontakt jede gültige Quelle ist, die in die Zwischenablage kopiert wird, um dann in das Blatt „Informationen abrufen“ eingefügt zu werden.

Das erneute Anwenden der Symboldatei nach dem Speichern der .scpt-Datei im Skriptdebugger führt dazu, dass das com.apple.ResourceFork erweiterte Attribut weiter an Größe zunimmt, während möglicherweise der Zugriff auf die angesammelten Symboldateien verloren geht, kann ich nicht mit Sicherheit sagen, da ich nicht genug getan habe testen. Obwohl der Skripteditor die benutzerdefinierte Symboldatei beibehält, scheint es leider dennoch, dass die Größe des com.apple.ResourceFork erweiterten Attributs ebenfalls zunimmt.

Um die Dateigröße zu reduzieren, indem Sie speziell die com.apple.ResourceFork erweiterten Attribute entfernen , verwenden Sie die folgende Befehlssyntax in Terminal:

xattr -d com.apple.ResourceFork filename.ext

Wenden Sie dann das benutzerdefinierte Symbol erneut auf die Datei an.

Schauen Sie sich die Manpage für xattrin Terminal an, indem Sie sie eingeben xattrund dann mit der rechten Maustaste darauf klicken und Manpage öffnen aus dem Kontextmenü auswählen.

Das Problem mit dem Zurücksetzen des Skriptdebuggers auf das Standardsymbol muss wahrscheinlich mit dem Entwickler behoben werden, oder verwenden Sie die in der Antwort von wch1zpink vorgeschlagene Problemumgehung.

Da das com.apple.ResourceFork erweiterte Attribut unabhängig davon wächst, welche der Apps Sie verwenden, Skript-Editor oder Skript-Debugger, ist dies ein Problem, das Apple angehen muss.

Ich weiß, dass Sie OS X El Capitan 10.11.6 verwenden, aber ich habe dies unter macOS Sierra 10.12.5 getestet und das Verhalten ist anscheinend dasselbe, es spielt wahrscheinlich keine Rolle, dass ich dies in einer späteren Betriebssystemversion getestet habe. Ich habe Script Debugger 6.0.4 verwendet.

Aufgrund der Wiederholbarkeit dessen, was Sie tun, bietet sich hier eine Skriptlösung an, um den Aufwand zu reduzieren, der erforderlich ist, um sowohl eine kleine Dateigröße einschließlich erweiterter Attribute als auch das benutzerdefinierte Symbol beizubehalten.


Aktualisieren:

Nachdem ich unter OS X 10.8.5 einen ähnlichen Weg eingeschlagen hatte, das Symbol einer Datei programmgesteuert festlegte und fast jede Lösung getestet hatte, die unter How can I change a file or folder icon using the Terminal vorgestellt wurde , entschied ich mich für die Verwendung setfileicon von this answer , wie es damals das Beste für meine Bedürfnisse formulierte.

Der folgende AppleScript-Code ist ein Beispielcode, der das com.apple.ResourceFork erweiterte Attribut der Zieldatei programmgesteuert löschen kann, um die Gesamtgröße zu reduzieren und das Symbol der Zieldatei zurückzusetzen. Es ist um die Verwendung der in der Antwort von wch1zpink vorgeschlagenen Problemumgehung geschrieben und verweist auf das Sperren der Datei, um das Symbol während des Speicherns unter Script Debugger intakt zu halten.

Der Hauptzweck dieses Beispielcodes besteht darin, zu zeigen, wie das com.apple.ResourceFork erweiterte Attribut der Zieldatei gelöscht und das benutzerdefinierte Symbol programmgesteuert zurückgesetzt wird. Ich habe den Code zum Entsperren/Sperren der Zieldatei eingefügt, wenn Sie diese Methode verwenden, um das Symbol zwischen dem Speichern intakt zu halten. Andernfalls kann es entfernt werden. com.apple.ResourceFork Ich denke, es hängt nur davon ab, wie oft die Größe des erweiterten Attributs der Zieldatei zurückgesetzt werden soll .

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

Anmerkungen:

Für diesen Beispielcode habe ich das setfileiconBefehlszeilendienstprogramm und die Zieldateien icon.icnsim Ordner bin im Stammverzeichnis meines Home- Ordners abgelegt. Die icon.icnsDatei ist die .icns- Datei derjenigen, die in Ihrer Frage verlinkt ist. Sie könnten die PNG- Datei verwenden , aber ich glaube, dass die .icns- Datei ein besseres Bild erzeugt.

Das Skript könnte fester und nicht so ausführlich codiert sein, aber ich habe es aus einigen Gründen so codiert, auf die ich nicht näher eingehen werde, es sei denn, Sie benötigen eine Erklärung. Fühlen Sie sich frei, den Beispielcode zu verwenden, um eine funktionierende Lösung nach Bedarf/Wunsch in Ihrer Umgebung zu implementieren.

Getestet wurde dies unter macOS Sierra 10.12.5, sollte aber auch unter OS X El Capitan 10.11.6 funktionieren.

Brillant. Besonders das "Set gesperrt" ;-)
@wch1zpink, Der Verdienst für das Sperren der Datei, damit das benutzerdefinierte Symbol beim Speichern mit dem Skript-Debugger intakt bleibt, als Problemumgehung liegt ganz bei Ihnen (und ich muss Ihrer Antwort +1 dafür geben)! Aber was für ein unangenehmes Problem, wenn das erweiterte Attribut com.apple.ResourceFork weiter wächst! Zumindest zwischen unseren beiden Antworten gibt es eine Problemumgehung, um beide Probleme zu lösen.
Ich war gerade in den Manpages für xattr und habe etwas gelernt und gelesen. Ich schreibe jetzt erst seit etwa acht Monaten Skripte und hatte davor keinerlei Programmierkenntnisse. So viel zu lernen. Ehrlich gesagt, Ihre Antworten und Antworten haben mich so viel gelehrt. Danke Alter
Ich habe auch die Manpage von Iconset gelesen und nachgesehen, ob es irgendwelche Befehle gibt, die wir verwenden könnten. Interessantes Zeug
Meisterhaft gemacht. Ihr Code kümmert sich fehlerlos um beide Fehler. Vielen Dank für Ihren Einfallsreichtum! Danke auch, @wch1zpink! Diese Antwort ist ein Kunstwerk.
@ user3439894 Hier ist ein Gedanke/eine Frage. Könnte Ihr Skript als Handler gespeichert werden, indem Sie es einfach oben und unten in Ihr Skript einfügen. Weil ich weiß, dass der Skript-Editor und der Skript-Debugger das Speichern von Text in anderen Dateien ermöglichen. Auf diese Weise müssen Sie in allen neuen Skripts, die im Skript-Debugger erstellt werden, nur eine Eigenschaft hinzufügen, um die Skriptdatei (Ihr Skript) zu laden. Dann rufen Sie diesen Handler jederzeit auf, wenn Sie möchten?
@wch1zpink, Interessante Idee, denken Sie jedoch daran, dass dies offensichtlich nur bei einem gespeicherten AppleScript-Skript / einer gespeicherten App geschehen soll, dem ein benutzerdefiniertes Symbol auf die erwähnte Weise hinzugefügt wurde, da dies das einzige Mal ist, dass das erweiterte Attribut der Zieldatei com.apple.ResourceFork vorhanden ist unnötig vergrößert. Daher wird die Integration in den Code eines Skripts/einer Anwendung nichts Wertvolles bewirken, da es keinen mir bekannten Mechanismus innerhalb des Skript-Debuggers oder des Skript-Editors gibt, um den Code nur auf das Skript/die Anwendung auszulösen. App, die ein benutzerdefiniertes Symbol hat, nachdem sie in einer der beiden Apps gespeichert wurde.
Es ist jetzt 2021, irgendwelche Updates dazu?

Eigentlich gibt es eine Lösung. Ich habe die .icns-Datei über den von Ihnen angegebenen Link heruntergeladen. Ich habe dann die gesamte .icns-Datei aus dem Finder-Fenster auf das Symbolbild im Get-Info-Fenster des Skripts gezogen, das ich in der Script Debugger-App erstellt habe. Nachdem das neue Symbol festgelegt wurde, habe ich im Fenster „Informationen abrufen“ die Option „Datei sperren“ ausgewählt.

Geben Sie hier die Bildbeschreibung ein

Danach habe ich dieses Skript erneut in der Script Debugger-App geöffnet und einige Änderungen am Skript vorgenommen, das Skript neu kompiliert und erneut gespeichert. Als ich versuchte, es erneut zu speichern, bekam ich dieses Meldungsfenster.

Geben Sie hier die Bildbeschreibung ein

Ich habe die Option „Save Ayway“ und BINGO!! Die Änderungen wurden gespeichert, aber das benutzerdefinierte Symbol blieb unverändert.


Hier ist ein Vorschlag, dass vielleicht jemand den Ball schnappen und damit laufen kann. Anstatt es als Skriptdatei im Skriptdebugger zu speichern, speichern Sie es als Skriptpaket (.scptd). Danach Strg+Klicken Sie auf diese Datei im Finder und wählen Sie „Paketinhalt anzeigen“. Fügen Sie Ihre benutzerdefinierte .icns-Datei zum Ordner „Ressourcen“ hinzu. Sie werden auch eine info.plist-Datei bemerken. Öffnen Sie die Datei info.plist in Xcode. Wenn Sie auf die Schaltfläche + in der Zeile der Liste der Informationseigenschaften klicken, erhalten Sie die Option, Symboldateien hinzuzufügen.

Geben Sie hier die Bildbeschreibung ein

Dies übersteigt den Rahmen meines Wissens, aber vielleicht kann die benutzerdefinierte Symboldatei hier irgendwie eingestellt werden.

Das ist eine interessante Problemumgehung für den Skriptdebugger, der das benutzerdefinierte Symbol nicht zurücksetzt, aber leider wächst das com.apple.ResourceFork erweiterte Attribut der Datei bei jedem Speichern weiter an. Daher muss das com.apple.ResourceFork erweiterte Attribut regelmäßig gelöscht und das Symbol zurückgesetzt werden. Dazu muss die Datei entsperrt werden, da auch mit sudodie Sperre nicht umgangen wird.
Ich glaube nicht, dass ein Dokumentenpaket eine Icon-Dateieigenschaft in der Info.plist unterstützt, Anwendungspakete jedoch schon.
Ich glaube, Sie haben mit dieser Beobachtung Recht, weil ich die notwendigen Anpassungen in der Plist-Datei vorgenommen habe, im Dokumentenpaket, aber sie haben das benutzerdefinierte Symbol nicht beibehalten, wenn ich die .scptd im Skript-Debugger erneut öffne und Änderungen vornehme und speichere.