0 votes

Problèmes de pomme de commande avec le changement de nom d'un fichier et en obtenant l'alias pour changer son nom aussi

Je rencontre un problème particulier avec un script plus important que j'écris. J'essaie de renommer tous les fichiers dans un dossier avec un préfixe de "temp_" et en même temps de garder l'alias de ce fichier toujours accessible depuis AppleScript une fois que le préfixe a été ajouté au fichier. Le code suivant fonctionne sur CERTAINS machines mais pas sur d'autres. Je l'ai essayé sur un MBP de 2018 tournant sous 10.13, un Mac Mini de 2012 tournant sous 10.13, et un iMac de 2015 tournant sous 10.13 et 10.14. L'iMac est la seule machine ayant un problème avec ce code :

tell application "Finder"
set theSelection to the selection -- vous devez donc avoir un dossier avec des fichiers sélectionnés dans Finder avant d'exécuter ce code.
set theFiles to the files of (item 1 of theSelection) -- obtenir les fichiers

Le code échoue sur CERTAINES machines lorsque j'essaie de convertir l'alias en un chemin posix. Sur les machines sur lesquelles ce script fonctionne, le test display dialog liste l'alias du fichier avec le nouveau nom. Ainsi, foo.txt devient temp_foo.txt. Sur les machines où le script échoue, le display dialog revient juste avec foo.txt comme nom de fichier.

Sur la machine sur laquelle cela échoue, le fichier sera renommé temp_foo.txt comme il se doit, mais l'alias ne se met jamais à jour, il continue donc de penser que le fichier s'appelle juste foo.txt. Sur les machines où le script échoue, la dernière commande pour définir la variable sur le chemin posix de l'alias échoue car l'alias est incorrect étant donné qu'il pointe toujours vers l'ancien nom de fichier.

Si nécessaire, je vais simplement renommer tous les fichiers dans une boucle, puis revenir pour obtenir les chemins posix dans une autre boucle, car en faisant un nouveau

set theTempFiles to files of (item 1 of theSelection)

Devrait obtenir une nouvelle liste des fichiers, maintenant avec leur préfixe "temp_". Mais cela me dérange de mettre une boucle répétée que je ne pense pas vraiment nécessaire puisque le code fonctionne BIEN sur certaines machines.

Qui peut m'aider à rendre mon code fonctionne correctement, et qui peut le faire échouer ? J'aimerais juste voir à quel point cela pose problème. Ce serait aussi bien si quelqu'un pouvait me dire si je fais quelque chose de terriblement mauvais dans mon code, et c'est pourquoi j'obtiens des résultats imprévisibles.

0 votes

Pourquoi ne pas supprimer l'alias, renommer le fichier d'origine, puis créer un nouvel alias en utilisant le nom de fichier correct ?

0 votes

Il ne s'agit pas d'un véritable alias tel que vous le verriez dans le système de fichiers. En AppleScript, il existe plusieurs façons de référencer des fichiers, et l'alias en est l'une. Pas sûr de la meilleure façon de le décrire. Donc, là où le script échoue, c'est en essayant de convertir cet "alias" en un chemin posix, mais l'alias (référence au fichier) n'a pas eu le nom du fichier mis à jour dans la référence elle-même. Ainsi, l'"alias" fait toujours référence à l'ancien nom du fichier.

0 votes

Laissez-moi deviner - la machine Mojave est celle avec le problème? Un alias est censé être une référence au fichier qui ne changera pas même s'il est déplacé ou renommé, mais il semble qu'il se soit cassé quelque part. Si vous allez finalement utiliser des chemins POSIX, vous pourriez envisager d'utiliser NSURL via quelque AppleScriptObjC.

1voto

red_menace Points 1014

Je pense que quelque chose s'est cassé quelque part, car un alias est censé être une référence à un élément de fichier qui reste valide même s'il est renommé ou déplacé. Si vous allez utiliser des chemins POSIX de toute façon, vous pourriez jeter un œil à l'utilisation de la classe NSURL de Cocoa (via certains AppleScriptObjC) pour suivre les références des fichiers, car c'est finalement ce qui est utilisé (ou censé être utilisé).

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

1voto

Gordon Williams Points 11

Une chose que j'ai remarquée à propos de la réponse de red_menace, c'est que la réponse donnée ne clarifiait pas vraiment pour moi comment travailler avec le fichier une fois qu'il a été modifié. Voici un petit exemple de travail pour un seul fichier sélectionné dans le Finder.

utiliser la version AppleScript "2.8"
utiliser le framework "Foundation"
utiliser les additions de script
tell application "Finder"
    set laSelection to premier élément de (sélection sous forme de liste d'alias) -- ceci est pour tester sur un seul fichier.
end tell

set unItem to chemin POSIX de laSelection
set fileRefURL to (NSURL de l'application en cours's fileURLWithPath:unItem)'s fileReferenceURL() -- obtenir la référence de fichier à partir du chemin.
tell application "System Events" to set the name of disk item unItem to "temp_" & (nom de l'élément de disque unItem)
set unItem to ((fileRefURL's |path|()) as text) -- c'est un exemple de configuration pour travailler avec l'emplacement du fichier mis à jour.
tell application "System Events" to set the name of disk item unItem to "temp2_" & (nom de l'élément de disque unItem)

Le (fileRefURL's |path|()) vous donne un accès répété/mis à jour au chemin POSIX du fichier, en d'autres termes, ce système un peu plus lourd vous permet d'accéder au fichier dans AppleScript de la manière dont un alias est censé le faire. Si, par exemple, vous voulez travailler avec le fichier d'une autre manière, vous pourriez (sans avoir à apprendre beaucoup d'objective-c ou de swift) entrer des choses comme

définir le fichierRef en tant que fichier POSIX ((fileRefURL's |path|()) as text)

Je suis sûr qu'il doit y avoir quelque chose de plus compact et astucieux pour ce travail, mais c'est la meilleure solution que j'ai pu trouver.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X