如何在mac预览版10.7中重新加载文件?

时间:2011-12-19 03:51:33

标签: macos applescript osx-lion preview

我想在更新后重新加载预览中的文件(.png,.pdf)。如何实现这一目标?

在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/$*'"' 

这适用于单个文件,但由于显而易见的原因而无法使用多个文件。我做了一些研究并尝试使用更复杂的涉及set和列表的AppleScript,但这会导致权限错误:

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

2 个答案:

答案 0 :(得分: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

要找到正确的“:”分隔路径,这里有一个简短的应用程序,可以显示给你。如果您想要“文件夹”路径而不是“文件”,只需更改代码中的单词即可。您会注意到这些样式路径始终以您的硬盘名称开头。

set colonDelimitedPath to (choose file) as text

如果你有一个posix风格的路径要转换为AppleScript风格的路径,请使用它。

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

答案 1 :(得分:1)

自2011年12月以来,OS X系统脚本已经发展,存在另一种选择。 OS X现在包含带有ObjC桥的自动化JavaScript(JXA)。

(警告:2011年OS X 10.7需要更新到10.10才能使用JXA)

虽然我没有做过测量基准测试,但在这种情况下,ObjC桥接器似乎比AppleScript Apple Events桥接器响应更快。

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