2011-12-19 10 views
5

Chciałbym załadować ponownie pliki (.png, .pdf) do podglądu po ich aktualizacji. Jak to osiągnąć?Jak ładować pliki w Mac 10.6?

W OS X 10.5 i 10.6 było to tak proste, jak przejście do Podglądu - automatycznie przeładowałoby nowy plik. Alternatywnie możesz użyć open -a Preview *.png lub czegoś podobnego. W wersji 10.7 automatyczne przeładowywanie nie działa (patrz this post).

Moja pierwsza próba jest skrypt AppleScript uruchomić z wiersza poleceń:

/usr/bin/osascript -e 'tell application "Preview.app" to activate 
    tell application "Preview.app" to open "'$PWD/$*'"' 

Działa to dla jednego pliku, ale nie powiedzie się z wielu plików z oczywistych powodów. Zrobiłem trochę więcej badań i spróbował wykorzystać bardziej skomplikowany AppleScript udziałem set oraz listę, ale to powoduje uprawnieniami błędów:

errors seen when using advanced script

Oto skrypt python użyłem (moje bash umiejętności skryptowych nie były do zadaniem ciąg parsowania):

#!/usr/bin/env python 

import optparse 
import os 

parser=optparse.OptionParser() 
options,args = parser.parse_args() 

pwd = os.getcwd() 

cmd = '/usr/bin/osascript -e ' 
scriptcmd = "tell application \"Preview.app\" to activate\n" 

flist = [ fn if fn[0]=='/' else pwd+"/"+fn for fn in args] 

scriptcmd += "set myList to {\"%s\"}\n" % ('","'.join(flist)) 

scriptcmd += "tell application \"Preview.app\" to open myList" 

print("%s \'%s\'" % (cmd,scriptcmd)) 

os.system("%s \'%s\'" % (cmd,scriptcmd)) 

nie jestem nawet pewien, że ten scenariusz byłby rozwiązany mój oryginalny problem - przeładunek obrazów bez widząc szary ekran - ale chciałbym wiedzieć, czy istnieje jakiś sposób, aby po prostu otwórz listę plików o numerze osascript zamiast open.

EDIT: Próbowano naprawić AppleScript, ale kod ten zostanie „brakujących wartości” błędy:

tell application "Preview.app" to activate 
set myListOfImages to {":Users:adam:work:code:test.png"} 
tell application "Preview.app" to open myListOfImages 

Odpowiedz

1

Oto prosty applescript, który działa na mnie w 10.7.

set picsFolder to (choose folder with prompt "Choose the folder to search...") as text 

tell application "Finder" 
    set theImages to (files of folder picsFolder whose name extension is "jpg") as alias list 
end tell 

tell application "Preview" 
    activate 
    open theImages 
end tell 

Widzę kilka błędów w poleceniu osascriptowym wymienionym w twoim poście. Najpierw komenda osascript nie jest poprawnie uformowana. Po drugie, próbujesz użyć ścieżek posix-style (np. Rozdzielonych przecinkami) w komendzie applecript. Applescript wymaga ścieżek w stylu AppleScript (np. Rozdzielanych dwukropkami). Są też inne problemy. W każdym razie, oto osascript że można uruchomić z wiersza poleceń i działa przeszukując bieżący katalog roboczy, jak staraliśmy się zrobić ...

/usr/bin/osascript -e 'set posix_picsFolder to do shell script "PWD"' -e 'set picsFolder to (POSIX file posix_picsFolder) as text' -e 'if picsFolder does not end with ":" then set picsFolder to picsFolder & ":"' -e 'tell application "Finder" to set theImages to (files of folder picsFolder whose name extension is "jpg") as alias list' -e 'tell application "Preview"' -e 'activate' -e 'open theImages' -e 'end tell' 

UWAGA: mój kod wygląda dla plików JPG, więc po prostu zmiana jpg do png lub dowolne inne rozszerzenie plików, które chcesz.

EDIT: aby odpowiedzieć na dodatkowe pytania z komentarzy

Jeśli chcesz wyszukać wiele rozszerzeń można używać „lub” jak to ...

tell application "Finder" 
    set theImages to (files of folder picsFolder whose name extension is "jpg" or name extension is "png") as alias list 
end tell 

Aby znaleźć właściwą ":" rozdzielona ścieżka, oto krótki cytat, który ci je pokaże. Jeśli chcesz użyć ścieżki "folderu" zamiast "pliku", po prostu zmień słowa w kodzie. Zauważysz, że te ścieżki stylów zaczynają się zawsze od nazwy twojego twardego dysku.

set colonDelimitedPath to (choose file) as text 

A jeśli masz ścieżkę w stylu posika, którą chcesz przekonwertować na ścieżkę stylu jabłka, użyj tego.

set posixPath to "/Applications/" 
set macPath to (POSIX file posixPath) as text 
+0

Dzięki, że dużo AppleScript nic nie wiedziałem o. Czy istnieje sposób na zmodyfikowanie skryptu, aby zaakceptować tylko podzbiór plików w katalogu i/lub wyszukać wiele rozszerzeń? Próbowałem zmodyfikować mój kod do użycia: zamiast /, ale teraz dostaję błędy "brakującej wartości" ... zobacz edycję dla przykładu – keflavich

+0

Zobacz moją edycję odpowiedzi na powyższe pytania. – regulus6633

1

Od grudnia 2011 r. Skrypty systemowe OS X ewoluowały tak, że istnieje inna opcja. OS X zawiera teraz JavaScript dla automatyzacji (JXA) z mostem ObjC.

(zastrzeżenie: OS X 10.7 w roku 2011 będą musiały zostać zaktualizowane do 10.10 w użyciu JXA)

Mimo, że nie zrobiłeś zmierzony poziom odniesienia, ObjC most wydaje się reagować szybciej niż AppleScript zdarzenia Apple mostu ta sprawa.

#!/usr/bin/env osascript -l JavaScript 
ObjC.import('AppKit'); 

var urls = getSelectedFiles(); 

// withAppBundleIdentifier:(NSString *)appBundleIdentifier 
var appBundleIdentifier = $.NSString.alloc.initWithUTF8String('com.apple.Preview'); 

// options:(NSWorkspaceLaunchOptions)options 
var options = $.NSWorkspaceLaunchWithoutActivation | $.NSWorkspaceLaunchWithErrorPresentation; 

// additionalEventParamDescriptor:(NSAppleEventDescriptor *)descriptor 
var nilDescriptor = $(); // bridged nil 

// launchIdentifiers:(NSArray **)identifiers ... not used 
var nilIdentifiers = $(); // bridged nil 

// $.NSWorkspace.openURLs:withAppBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifiers() 
var ws = $.NSWorkspace.sharedWorkspace; 
ws.openURLsWithAppBundleIdentifierOptionsAdditionalEventParamDescriptorLaunchIdentifiers(
    urls, 
    appBundleIdentifier, 
    options, 
    nilDescriptor, 
    nilIdentifiers 
); 

function getSelectedFiles() { 
    var appFinder = Application("Finder"); 
    var selection = [].slice.call(appFinder.selection()); 

    var list = $.NSMutableArray.alloc.initWithCapacity(selection.length); 
    for (key in selection) { 
     var path = decodeURI(selection[key].url()); 
     path = path.replace(/file:\/\//,""); 
     var nsurl = $.NSURL.fileURLWithPath(path); 
     list.addObject(nsurl); 
    } 

    return $.NSArray.alloc.initWithArray(list); 
} 

Podejście JXA bez mostu Objective-C może być również używany:

var appPreview = Application("Preview"); 
var appFinder = Application("Finder"); 

var selection = [].slice.call(appFinder.selection()); 

var paths = new Array(0); 
for (key in selection) { 
    paths.push(decodeURI(selection[key].url())); 
} 

appPreview.activate(); 
for (key in paths) { 
    console.log(paths[key]); 
    appPreview.open(Path(paths[key])); 
} 
Powiązane problemy