Làm cách nào để đóng cửa sổ từ một ứng dụng, chuyển tên tệp?


9

Tôi đang cố gắng tạo một lệnh shell dựa trên Applescript để báo cho ứng dụng Preview từ Mac OS X để đóng một cửa sổ cụ thể.

#!/bin/sh

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

Nhưng điều này không hoạt động: Tôi nhận được thông báo lỗi

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

Câu hỏi liên quan: Làm cách nào để đóng ứng dụng OS X từ dòng lệnh bằng cách sử dụng bí danh được xác định trong .bash_profile của tôi?


Điều này sẽ làm việc như mong đợi. Làm thế nào bạn gọi kịch bản của bạn, chính xác? Lưu ý: Tập lệnh của bạn sẽ không đóng một cửa sổ cụ thể. Nó sẽ thoát khỏi ứng dụng, do đó đóng tất cả các cửa sổ tài liệu mà ứng dụng có thể đã mở. Để đóng một tài liệu cụ thể, ứng dụng đã mở nhưng không thoát khỏi ứng dụng, bạn cần một tập lệnh khác. Mặc dù hầu hết các ứng dụng thoát khi cửa sổ tài liệu cuối cùng của chúng bị đóng, nhưng không phải tất cả các ứng dụng này cũng phụ thuộc vào phiên bản OS X mà bạn đang sử dụng.
slhck

@slhck: "đóng một tài liệu cụ thể mà ứng dụng đã mở nhưng không thoát khỏi ứng dụng mỗi lần" là chính xác những gì tôi cần. Bạn có tình cờ biết một nơi nào đó "kịch bản khác nhau" được giải thích không?
Ewan Delanoy

Câu trả lời:


10

Bắt Preview.app để chấp nhận các lệnh AppleScript

Theo mặc định, AppleScripting Preview sẽ không hoạt động vì Preview thiếu từ điển cần thiết. Để khắc phục điều này, hãy kiểm tra câu trả lời của Lauri tại đây , giải thích cài đặt NSAppleScriptEnabledcho Preview.app.

Thoát khỏi Preview.app, sau đó mở terminal và nhập:

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


Đóng cửa sổ từ một ứng dụng

1) Theo chỉ số cửa sổ hoặc tên của cửa sổ

Lệnh đóng cửa sổ của bất kỳ ứng dụng có tên nào sẽ giống như thế này:

tell application "Preview" to close window 1

Nếu bạn muốn đóng một cửa sổ tài liệu có tên, ví dụ foo.jpg:

báo cho ứng dụng "Xem trước" để đóng (mọi cửa sổ có tên là " foo.jpg ")

Vì vậy, trong kịch bản shell của bạn sẽ là:

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

Ở đây, đối số đầu tiên được truyền cho tập lệnh là tên của cửa sổ bạn muốn đóng, vd ./quit.sh foo.jpg. Lưu ý rằng nếu tệp của bạn chứa khoảng trắng, bạn phải trích dẫn tên tệp, vd ./quit.sh "foo bar.jpg".

Hoặc nếu bạn muốn đóng các cửa sổ tùy ý từ bất kỳ ứng dụng nào, hãy sử dụng:

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

Ở đây, bạn sẽ sử dụng ./quit.sh Preview foo.jpgví dụ.

2) Theo tên tập tin

Nếu bạn muốn đóng một cửa sổ thuộc về một tài liệu nhất định, nhưng cung cấp tên tệp, bạn cần một cái gì đó khác. Điều này là do một tệp PDF nhiều trang có thể được hiển thị dưới dạng foo.pdf (Page 1 of 42), nhưng bạn chỉ muốn chuyển foo.pdfsang AppleScript.

Ở đây chúng tôi lặp lại qua các cửa sổ và so sánh tên tệp với đối số được truyền cho tập lệnh:

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

Bây giờ bạn có thể chỉ cần gọi ./quit.sh foo.pdf. Theo cách tổng quát, đối với tất cả các ứng dụng có cửa sổ tài liệu được đặt tên, đó sẽ là:

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


Hãy cẩn thận: Tự động đóng Preview.app

Preview.app là một trong những ứng dụng này tự động thoát khi cửa sổ tài liệu cuối cùng của nó bị đóng. Nó làm điều đó để tiết kiệm bộ nhớ và "dọn dẹp". Để vô hiệu hóa hành vi này, hãy chạy như sau:

defaults write -g NSDisableAutomaticTermination -bool TRUE

Tất nhiên, để hoàn tác điều đó, thay đổi TRUEthành FALSE.


Sử dụng các chức năng thay vì các tập lệnh

Cuối cùng, tôi khuyên bạn nên đặt các tập lệnh của mình vào một hàm luôn có sẵn trong trình bao của bạn. Để làm điều này, thêm các kịch bản cho của bạn ~/.bash_profile. Tạo tập tin này nếu nó không tồn tại.

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
}

Khi bạn lưu hồ sơ bash của bạn và khởi động lại shell, bạn có thể gọi cw Preview foo.pdftừ mọi nơi.


Tôi đã thử điều này. Lần này tôi không nhận được thông báo lỗi, nhưng tập lệnh vẫn không hoạt động: cửa sổ vẫn hiển thị trên màn hình.
Ewan Delanoy

Nó làm việc cho tôi. Nếu bạn mở một tài liệu trong Preview.app, sau đó mở AppleScript Editor và nhập tell application "Preview" to windows, điều đó có cho bạn kết quả nào không? Kịch bản chính xác nào bạn đang chạy?
slhck

Tôi không sử dụng trình soạn thảo AppleScript, tôi chỉ sử dụng "mã applescript nhúng" trong tập lệnh bash, như được giải thích trong OP, được lưu trữ trong tệp .sh.
Ewan Delanoy

Trên thực tế, tôi thường khá hài lòng với các kịch bản shell và đây là bản thảo đầu tiên của tôi. Tôi chỉ làm những gì bạn đã khuyên trong bình luận cuối cùng của bạn và nhận được: "{window id 113 của ứng dụng" Preview "}" như một câu trả lời. Đó có phải là những gì tôi nên nhận được?
Ewan Delanoy

Ngoài ra, khi tôi biên dịch << nói với ứng dụng "Xem trước" để đóng "musixdoc.pdf" >> với trình chỉnh sửa applescript, nó cũng không hoạt động: cửa sổ musixdoc.pdf vẫn hiển thị trên màn hình.
Ewan Delanoy

0

Câu trả lời của slhck có vẻ tốt và kỹ lưỡng. Coi chừng, thực thi dòng mã thứ ba :

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

'dường như' đã khiến cho Preview bị sập trong mỗi lần khởi chạy với những điều sau:

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

Theo hướng dẫn sử dụng mã, điều đó -fbuộc 'ký mã thay thế và chữ ký hiện có' và -slà 'ký mã theo đường dẫn được đưa ra' trong trường hợp này-

Rõ ràng, Preview hiện được ký không chính xác và không sử dụng được. :

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.