如何关闭应用程序窗口并传递文件名?

如何关闭应用程序窗口并传递文件名?

我正在尝试生成一个基于 Applescript 的 shell 命令,告诉 Mac OS X 中的预览应用程序关闭特定窗口。

#!/bin/sh

osascript <<EOF
tell application "Preview"
   close "$1"
end tell
EOF

但这不起作用:我收到错误消息

25:52: execution error: Preview got an error: "musixdoc.pdf" doesn’t understand the close message. (-1708)

相关问题:如何使用我的 .bash_profile 中定义的别名从命令行关闭 OS X 应用程序?

答案1

让 Preview.app 接受 AppleScript 命令

默认情况下,AppleScripting Preview 无法工作,因为 Preview 缺少必要的词典。要解决此问题,请检查Lauri 的回答在这里,解释了NSAppleScriptEnabledPreview.app 的设置。

退出 Preview.app,然后打开终端并输入:

sudo defaults write /Applications/Preview.app/Contents/Info NSAppleScriptEnabled -bool true
sudo chmod 644 /Applications/Preview.app/Contents/Info.plist
sudo codesign -f -s - /Applications/Preview.app


关闭应用程序窗口

1)按窗口索引或窗口名称

关闭任何命名应用程序的窗口的命令将是这样的:

tell application "Preview" to close window 1

…或者如果您想关闭一个命名的文档窗口,例如foo.jpg

告诉应用程序“预览”关闭(每个名称为“foo.jpg“)

因此,在你的 shell 脚本中应该是:

#!/bin/sh
osascript <<EOF
tell application "Preview"
  close (every window whose name is "$1")
end tell
EOF

这里,传递给脚本的第一个参数是要关闭的窗口的名称,例如./quit.sh foo.jpg。请注意,如果您的文件包含空格,则必须用引号引起文件名,例如./quit.sh "foo bar.jpg"

或者,如果您想关闭任何应用程序的任意窗口,请使用以下命令:

#!/bin/sh
osascript <<EOF
tell application "$1"
  close (every window whose name is "$2")
end tell
EOF

这里,您可以使用./quit.sh Preview foo.jpg例如。

2)按文件名

如果您想要关闭属于某个文档的窗口,但又想提供文件名,则需要其他东西。这是因为多页 PDF 可以显示为foo.pdf (Page 1 of 42),但您只想传递foo.pdf给 AppleScript。

这里我们迭代窗口并将文件名与传递给脚本的参数进行比较:

osascript <<EOF
tell application "Preview"
    set windowCount to number of windows
    repeat with x from 1 to windowCount
        set docName to (name of document of window x)
        if (docName is equal to "$1") then
            close window x
        end if
    end repeat
end tell
EOF

现在您只需调用 即可./quit.sh foo.pdf。一般来说,对于所有具有命名文档窗口的应用程序,这将是:

osascript <<EOF
tell application "$1"
    set windowCount to number of windows
    repeat with x from 1 to windowCount
        set docName to (name of document of window x)
        if (docName is equal to "$2") then
            close window x
        end if
    end repeat
end tell
EOF


警告:自动关闭 Preview.app

Preview.app 是此类应用程序之一,一旦关闭最后一个文档窗口,它就会自动退出。这样做是为了节省内存并“清理”。要禁用此行为,请运行以下命令:

defaults write -g NSDisableAutomaticTermination -bool TRUE

当然,要撤消该操作,请更改TRUEFALSE


使用函数代替脚本

最后,我建议将脚本放入 shell 中始终可用的函数中。为此,请将脚本添加到~/.bash_profile。如果不存在,请创建此文件。

cw() {
osascript <<EOF
tell application "$1"
    set windowCount to number of windows
    repeat with x from 1 to windowCount
        set docName to (name of document of window x)
        if (docName is equal to "$2") then
            close window x
        end if
    end repeat
end tell
EOF
}

一旦保存了 bash 配置文件并重新启动 shell,您就可以cw Preview foo.pdf从任何地方调用。

答案2

slhck 的回答看起来不错,也很透彻。注意,正在执行第三行代码

sudo codesign -f -s - /Applications/Preview.app

“似乎”导致 Preview 每次启动时都会崩溃,具体如下:

Application Specific Information:
XPC domain creation failed: The code signature is not valid: The operation couldn’t be completed. (OSStatus error -67061.)

根据代码设计手册,这-f是强制“用代码签名替换现有签名”,并且-s是“在给定的路径上对代码进行签名”……在这种情况下-

显然,预览现在签名错误,无法使用。:(

相关内容