2010-08-14 36 views
0

J'ai un ou plusieurs fichiers et/ou dossiers sélectionnés dans le Finder. Je les copie manuellement dans le presse-papier/le carton (⌘C).AppleScript: J'ai copié la sélection du Finder dans le presse-papier. Puis-je obtenir le chemin complet des éléments copiés?

Pour simplifier les choses, disons que je viens de copier un seul fichier normal. La solution idéale, cependant, traiterait de nombreux fichiers et une sélection mixte avec des dossiers, des alias.

Maintenant que ce fichier est dans le presse-papiers, je veux obtenir son chemin complet (de préférence le chemin POSIX).


Pour gagner du temps:

  • Je suis à la recherche d'une solution AppleScript (ou rb-appscript).
  • Je ne veux pas obtenir le chemin directement à partir de la sélection. Cela doit provenir de l'article dans le presse-papiers.
  • Vraiment, je sais que je peux contourner cela en copiant le chemin (s) à la sélection d'abord, puis faire ce que je suis en train de faire avec.

Ce que je sais à ce jour (noté dans rb-appscript):

  • OSAX.osax.the_clipboard a une chaîne de noms de fichier sans chemin d'accès.
  • Appscript.app('Finder').clipboard.get est apparemment pas mis en œuvre (dit le dictionnaire « Pas encore disponible », appelant retourne :missing_value
+0

Un avertissement si vous testez ceci sur TextMate: si vous copiez dans le Finder et de passer à TM pour exécuter le script à partir de l'intérieur, TM gâchera les données du presse-papiers, qui ne contiendront plus désormais: data_url data, juste des formats de chaînes variés. Vous pouvez le vérifier en inspectant clipboard_info, en l'exécutant une fois à partir de TM, une fois directement dans le terminal. N'oubliez pas de copier à nouveau dans le viseur avant chaque tentative. – kch

Répondre

2

Le AppleScript suivant semble faire l'affaire.

POSIX path of (the clipboard as «class furl») 

S'il y a plusieurs éléments sur dans le presse-papiers, il renvoie uniquement le chemin POSIX du premier élément

Voir aussi AppleScript command reference pour la commande the clipboard


rb-appscript Version:

OSAX.osax.the_clipboard(:result_type => :file_url).path 
+0

Génial, cela fonctionne. Je suppose qu'il n'y a aucun moyen d'obtenir une liste de furls? – kch

+0

Je n'ai pas trouvé un moyen. Récupérer le contenu du presse-papiers sous la forme d'une liste vous donnera simplement une liste avec un élément de texte qui contient tous les noms de fichiers. – sakra

0

juste pensé que je partagerais le code rb-appscript que j'ai écrit après la réponse de Sakra:

#!/usr/bin/arch -i386 /usr/bin/ruby 
require "rubygems" 
require "osax" 
include OSAX 


def path_from_clipboard 
    osax.clipboard_info.flatten.include? :file_url or raise "clipboard does not contain path data" 
    osax.the_clipboard.count("\r") == 0   or raise "clipboard contains more than one path" 
    osax.the_clipboard(:result_type => :file_url).path 
end 

puts path_from_clipboard 
1

Voici un AppleScript qui obtenir tous des chemins posix du presse-papiers, pas seulement le premier ...

set theFiles to paragraphs of (get the clipboard) 

set posixPaths to {} 
repeat with aFile in theFiles 
    try 
     tell application "Finder" to set thePath to item aFile as text 
     set end of posixPaths to (POSIX path of thePath) 
    end try 
end repeat 
return posixPaths 
+1

Ne semble pas fonctionner pour moi. posixPaths finit toujours vide. – kch

+0

Quoi qu'il en soit, si je comprends ce qui se passe, cela semble floconneux. Que se passe-t-il si je copie plusieurs entrées à partir d'une fenêtre de résultats de recherche? – kch

+0

Fonctionne lorsque vous copiez des fichiers ou des dossiers à partir d'une fenêtre normale du Finder. Les fenêtres de recherche ne sont pas des fenêtres normales et ne fonctionnent pas de la même façon ... donc cela ne fonctionnera pas. – regulus6633

0

Le Finder étant ce qu'il est, et AppleScript étant ce qu'il est, il est trop difficile de faire le tour. Alors, qu'est-ce que j'ai fait, j'ai sauté dans Cocoa.

L'un ou l'autre de ces scripts renvoie la liste des chemins absolus sur une nouvelle ligne.

MacRuby:

#!/usr/bin/env macruby 
# encoding: UTF-8 
framework 'Cocoa' 
puts NSPasteboard.generalPasteboard.pasteboardItems 
    .map { |pbi| pbi.stringForType('public.file-url') }.compact 
    .map { |url| NSURL.URLWithString(url).path } 

Nu:

#!/usr/bin/env nush 
(puts ((((((NSPasteboard generalPasteboard) pasteboardItems) 
    map: (do (pbi) (pbi stringForType: "public.file-url"))) 
    select: (do (url) (url))) 
    map: (do (url) ((NSURL URLWithString: url) path))) componentsJoinedByString: "\n"))