2011-12-19 59 views
5

我想在更新後在預覽中重新加載文件(.png,.pdf)。這如何實現?如何在mac預覽10.7中重新加載文件?

在OS X 10.5和10.6中,它與切換到預覽一樣簡單 - 它會自動重新加載新文件。或者,您可以使用open -a Preview *.png或類似的東西。在10.7中,自動重新加載不起作用(請參閱this post)。

我第一次嘗試是在命令行中運行AppleScript腳本:

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

這適用於單個文件,但失敗,原因是顯而易見的多個文件。我做了一些更多的研究和使用更復雜的AppleScript涉及set和列表試過了,但是這會導致權限錯誤:

errors seen when using advanced script

這裏的Python腳本我用(我的bash腳本技能是不達字符串解析的任務): - 沒有看到一個灰色的屏幕重裝圖片 - 我甚至不能確定這個腳本會解決我原來的問題

#!/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)) 

,但我想知道是否有任何的方式來簡單地用osascript打開文件列表而不是open

編輯:試圖修復AppleScript的,但是這個代碼被「遺漏值」的錯誤:

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

回答

1

這裏有一個簡單的AppleScript,在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 

我在您的文章中列出的osascript命令中看到一些錯誤。首先,osascript命令沒有正確形成。其次,你試圖在applescript命令中使用posix風格的路徑(例如斜線分隔)。 Applescript需要applescript樣式的路徑(例如冒號分隔符)。還有其他問題。總之,這裏是一個你可以在命令行運行osascript和它的作品通過搜索,你試圖做當前的工作目錄...

/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' 

注:我的代碼查找JPG文件,所以只是改變JPG到PNG或任何其他文件擴展名你想要的。

編輯:從評論回答您的其他問題

如果你想搜索,您可以使用「或」多個分機像這樣...

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 

要找到正確的「:」劃定的路徑,這是一個簡短的applescript,它會顯示給你。如果你想要一個「文件夾」路徑而不是「文件」,只需更改代碼中的單詞。您會注意到這些樣式路徑始終以您的硬盤驅動器名稱開頭。

set colonDelimitedPath to (choose file) as text 

如果你有一個posix風格的路徑,你想要轉換成applescript樣式的路徑使用這個。

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

謝謝,這是一個很大的AppleScript的我一無所知。有什麼方法可以修改您的腳本以僅接受目錄中的一部分文件和/或搜索多個擴展?我試圖修改我的代碼來使用:而不是/,但現在得到「缺失值」的錯誤...請參閱編輯示例 – keflavich 2011-12-29 16:51:29

+0

請參閱我的編輯以獲取上述問題的答案。 – regulus6633 2011-12-30 09:28:35

1

自2011年12月以來,OS X系統腳本已經演變爲存在另一種選擇。 OS X現在包含帶有ObjC橋的JavaScript自動化(JXA)。

(警告:OS X 2011的10.7將需要更新,以10.10使用JXA)

雖然我沒有做過的測量基準,ObjC橋似乎迴應比的AppleScript蘋果事件橋更快這個案例。

#!/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); 
} 

沒有Objective-C的大橋有JXA方法也可用於:

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])); 
} 
相關問題