2011-12-19 60 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])); 
} 
相关问题