Comment puis-je modifier ou définir l'icône d'un fichier ou d'un dossier dans le terminal ? Dois-je utiliser un langage de script ?
Réponses
Trop de publicités?Tout comme la solution Python utilisant PyObjC, il s'avère que cela peut être fait avec AppleScript (qui n'est pas déprécié dans 10.15 Catalina, contrairement à Python et aux autres langages de script).
J'ai trouvé un exemple de la manière de procéder sur GitHub ici :
#!/usr/bin/env osascript use framework "AppKit" -------------------------------------------------------------------------------- # PROPERTY DECLARATIONS: property this : a reference to current application property NSWorkspace : a reference to NSWorkspace of this property NSImage : a reference to NSImage of this -------------------------------------------------------------------------------- # IMPLEMENTATION: on run argv set icon to item 1 of argv set target to item 2 of argv setIcon to icon for target end run -------------------------------------------------------------------------------- # HANDLERS: to setIcon to iconPath for filePath set sharedWorkspace to NSWorkspace's sharedWorkspace() set newImage to NSImage's alloc() set icon to newImage's initWithContentsOfFile:iconPath set success to sharedWorkspace's setIcon:icon forFile:filePath options:0 end setIcon
L'AppleScript n'est pas facile à lire, mais il est apparemment possible d'accéder au code Objective-C pour faire cela via le framework AppKit.
Il y a une sorte de bug (qui se produit dans les dossiers dans le cadre de la synchronisation iCloud) avec le changement d'icônes des "dossiers" ou des fichiers, enfin dans Catalina : Quand l'icône change, l'interface ne rafraîchit pas le dossier avec la nouvelle icône quand il en a une plus ancienne. Ainsi, la deuxième fois que vous définissez une icône, elle ne se rafraîchit pas tout le temps. Même si vous le faites manuellement avec cmd+i et en collant une image précédemment copiée comme icône, iCloud devient fou avec cela.
En cherchant une solution de contournement, j'ai trouvé cette petite correction (pas idéale mais qui fonctionne) : - ceci est en Javascript JXA pour l'automatisation
function makeIcon(theFolder, theFile) {
var img = $.NSImage.alloc.initByReferencingFile( theFile );
var updateUUID = newUUID()+".txt";
terminal("echo -n > "+ sanityzeForBash(theFolder+"/Icon\r") );
terminal("rm "+ sanityzeForBash(theFolder+"/Icon\r") );
writeTextFile(theFolder+"/"+updateUUID, "_");
$.NSWorkspace.sharedWorkspace.setIconForFileOptions(img, theFolder, 0);
delay(1);
terminal("rm "+ sanityzeForBash(theFolder+"/"+updateUUID) );
}
function writeTextFile(fileName, text) {
var file = app.openForAccess(Path(fileName), { writePermission: true })
app.setEof(file, { to: 0 });
app.write( getProperties(text) +"\n\r", { to: file, startingAt: app.getEof(file) })
app.closeAccess(file)
return true;
}
function sanityzeForBash(s) {
return "'"+ s.replace("'","\\'") +"'";
}
function newUUID(){
return ObjC.unwrap($.NSUUID.UUID.UUIDString);
}
function terminal(c) {
var app = Application.currentApplication();
app.includeStandardAdditions = true;
return app.doShellScript(c);
}
L'idée du "truc" est de créer un fichier à l'intérieur du dossier avant de changer l'icône pour forcer la synchronisation avec iCloud, puis d'attendre 1s pour supprimer le fichier.
- Réponses précédentes
- Plus de réponses