【问题标题】:How to get filename without extension from Omnigraffle?如何从 Omnigraffle 获取不带扩展名的文件名?
【发布时间】:2012-03-01 12:25:31
【问题描述】:

我正在尝试在 Omnigraffle Professional 5 中获取不带当前文档文件扩展名的文件名。

tell application "OmniGraffle Professional 5"
    set _document to front document
    set _path to path of _document

    -- Get filename without extension
    tell application "Finder"
        set {_filename, _extension, _ishidden} to the
             {displayed_name, name_extension, extension_hidden} of the _path
    end tell
end tell

这给了我以下错误:error "Can’t get displayed_name of \"/Users/ca/Downloads/Feb 8.graffle\"." number -1728 from displayed_name of "/Users/ca/Downloads/Feb 8.graffle"。

我找到了一些相关的问题和页面,但我有点迷茫,真的不明白为什么它不起作用。

感谢您的帮助!

【问题讨论】:

    标签: macos path applescript


    【解决方案1】:

    您需要将其更改为以下内容:

    tell application "OmniGraffle Professional 5"
        set _document to front document
        set _path to path of _document
    
        -- Get filename without extension
        tell application "Finder"
        set {_filename, _extension, _ishidden} to the ¬
                   {displayed name, name extension, extension hidden} ¬
                    of ((the _path as POSIX file) as alias)
        end tell
        if (_extension ≠ missing value) then
            set baseName to text 1 thru -((length of _extension) + 2) of _filename
        end if
    
    end tell
    

    "path of front document" 返回文件的 POSIX 路径,它只是一个纯字符串。为了能够获取有关项目的信息,Finder 将需要对相关文件的别名引用。当您传递纯字符串时,它会出现错误,因为纯字符串不具有这些属性。要获取别名,您需要先将普通路径强制转换为 POSIX 文件,然后将 POSIX 文件强制转换为别名。

    除非您在其他地方定义了这些变量,否则您需要删除 {displayed_name、name_extension、extension_hidden} 中的下划线。当您查看带有下划线的“已编译”代码时,如下图所示:

    因此,AppleScript 将 displayed_name 解释为变量,而不是属性。现在,如果您在其他地方定义了这些变量,例如在脚本顶部的属性中,那很好。但如果不是,则需要删除下划线,因为 Finder 项目的属性名称中没有下划线。删除下划线后,颜色显示正确(属性为紫色,变量为绿色)。

    请注意,这仍然不会为您提供没有扩展名的文件名。为此,您需要像我在添加的行中使用 text n thru m 所做的那样

    if (_extension ≠ missing value) then
        set baseName to text 1 thru -((length of _extension) + 2) of _filename
    end if
    

    【讨论】:

    • 非常感谢。这真是一个很棒的答案。也感谢您的解释。
    【解决方案2】:

    首先,您需要为所针对的任何应用程序的属性使用正确的标签 - 这些标签可以在应用程序脚本字典中找到。下一个问题是 Finder 对 POSIX 路径一无所知,这显然是 OmniGraffle 为文档路径返回的内容,因此您需要将路径强制转换为Finder 确实知道的东西,例如别名。

    tell application "Finder"
        set {_filename, _extension, _ishidden} to the {displayed name, name extension, extension hidden} of (_path as POSIX file as alias)
    end tell
    

    【讨论】:

    • "as POSIX file as alias" 看起来不对 - 如果可以将某些内容强制转换为 POSIX 路径,为什么不能直接将其强制转换为别名?我错过了什么吗?
    • 别名具有 POSIX 路径属性,但实际上没有一种方便的方法可以从 POSIX 路径转换回来,因为此时它只是文本。在这种情况下,我可能会省略转换为别名,但随后将不得不使用诸如 item 之类的附加术语,因为 POSIX 文件是一个伪类,只是工作起来很傻。别名是一种更通用的文件说明符,所以我只是用它来避免以后出现任何其他问题。
    猜你喜欢
    • 2011-06-15
    • 2011-10-02
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2010-10-15
    • 2014-08-15
    相关资源
    最近更新 更多