如何從應用程式中關閉視窗並傳遞檔案名稱?

如何從應用程式中關閉視窗並傳遞檔案名稱?

我正在嘗試產生一個基於 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 缺少必要的字典。若要解決此問題,請檢查勞裡的回答在這裡,其中解釋了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

「似乎」導致預覽版在每次啟動時崩潰,原因如下:

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

根據協同設計手冊,這-f就是強制“代碼簽名替換現有簽名”,並且-s是“在給定路徑上對代碼進行簽名”......在這種情況下-

顯然,預覽版現在簽署錯誤且無法使用。 :(

相關內容