ฉันจะปิดหน้าต่างจากแอปพลิเคชันส่งชื่อไฟล์ได้อย่างไร


9

ฉันกำลังพยายามสร้างคำสั่งเชลล์ที่ใช้ Applescript ซึ่งบอกแอปพลิเคชั่นดูตัวอย่างจาก 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)

คำถามที่เกี่ยวข้อง: ฉันจะปิดแอปพลิเคชัน OS X จากบรรทัดคำสั่งโดยใช้นามแฝงที่กำหนดใน. bash_profile ของฉันได้อย่างไร


ควรทำงานได้ตามที่คาดไว้ คุณเรียกสคริปต์ของคุณอย่างไร หมายเหตุ: สคริปต์ของคุณจะไม่ปิดหน้าต่างใดหน้าหนึ่ง มันจะออกจากแอปพลิเคชันดังนั้นจึงปิดหน้าต่างเอกสารทั้งหมดที่แอปพลิเคชันอาจเปิดอยู่ ในการปิดเอกสารเฉพาะที่แอปพลิเคชันเปิด แต่ไม่ออกจากแอปพลิเคชันต่อคุณต้องมีสคริปต์อื่น ในขณะที่แอปพลิเคชันส่วนใหญ่จะปิดเมื่อหน้าต่างเอกสารล่าสุดปิดไม่ได้ทั้งหมดนี้ขึ้นอยู่กับเวอร์ชันของ OS X ที่คุณใช้
slhck

@slhck: "ปิดเอกสารเฉพาะแอปพลิเคชันที่เปิด แต่ไม่ออกจากแอปพลิเคชันต่อ se" เป็นสิ่งที่ฉันต้องการ คุณรู้จักสถานที่ที่มีคำอธิบาย "สคริปต์ที่แตกต่าง" ดังกล่าวหรือไม่?
Ewan Delanoy

คำตอบ:


10

รับ Preview.app เพื่อรับคำสั่ง AppleScript

ตามค่าเริ่มต้น AppleScripting Preview จะไม่ทำงานเนื่องจาก Preview หายไปจากพจนานุกรมที่จำเป็น ในการแก้ไขปัญหานี้ให้ตรวจสอบคำตอบของ Lauri ที่นี่ซึ่งจะอธิบายการตั้งค่าNSAppleScriptEnabledสำหรับ Preview.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 ")

ดังนั้นในเชลล์สคริปต์ของคุณนั่นก็คือ:

#!/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


Caveat: ปิดแอพ Preview.app อัตโนมัติ

Preview.app เป็นหนึ่งในแอปพลิเคชันเหล่านี้ที่ออกโดยอัตโนมัติเมื่อหน้าต่างเอกสารล่าสุดถูกปิด มันทำเช่นนั้นเพื่อประหยัดหน่วยความจำและ "ล้าง" หากต้องการปิดใช้งานลักษณะการทำงานนี้ให้เรียกใช้สิ่งต่อไปนี้:

defaults write -g NSDisableAutomaticTermination -bool TRUE

ของหลักสูตรที่จะยกเลิกที่เปลี่ยนแปลงไปTRUEFALSE


การใช้ฟังก์ชั่นแทนสคริปต์

ในที่สุดฉันขอแนะนำให้วางสคริปต์ของคุณลงในฟังก์ชันที่มีอยู่ในเปลือกของคุณเสมอ ~/.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 แล้วรีสตาร์ทเชลล์คุณสามารถโทรได้cw Preview foo.pdfจากทุกที่


ฉันลองสิ่งนี้ ครั้งนี้ฉันไม่ได้รับข้อความแสดงข้อผิดพลาด แต่สคริปต์ยังคงไม่ทำงาน: หน้าต่างยังคงปรากฏบนหน้าจอ
Ewan Delanoy

มันใช้งานได้สำหรับฉัน หากคุณเปิดเอกสารใน Preview.app ให้เปิด AppleScript Editor แล้วป้อนtell application "Preview" to windowsที่ให้ผลลัพธ์ใด ๆ กับคุณหรือไม่ คุณใช้สคริปต์อะไร
slhck

ฉันไม่ได้ใช้โปรแกรมแก้ไข AppleScript ฉันใช้ "รหัส applescript แบบฝังตัว" ในสคริปต์ทุบตีตามที่อธิบายไว้ใน OP ซึ่งเก็บไว้ในไฟล์. sh
Ewan Delanoy

ที่จริงแล้วฉันมักจะมีความสุขกับเชลล์สคริปต์และนี่เป็น applescript แรกของฉัน ฉันเพิ่งทำสิ่งที่คุณแนะนำในความคิดเห็นสุดท้ายของคุณและได้รับ: "{window id 113 ของแอปพลิเคชัน" ดูตัวอย่าง "}" เป็นคำตอบ นั่นคือสิ่งที่ฉันควรได้รับ?
Ewan Delanoy

นอกจากนี้เมื่อฉันคอมไพล์ << บอกแอปพลิเคชัน "ดูตัวอย่าง" เพื่อปิด "musixdoc.pdf" >> ด้วยโปรแกรมแก้ไข applescript มันไม่ทำงานเช่นกัน: หน้าต่าง musixdoc.pdf ยังคงปรากฏอยู่บนหน้าจอ
Ewan Delanoy

0

คำตอบโดย 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คือการลงนามรหัสที่เส้นทางที่กำหนด' ... ในกรณีนี้-

เห็นได้ชัดว่าตอนนี้ภาพตัวอย่างมีการลงชื่ออย่างไม่ถูกต้องและใช้ไม่ได้ :(

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.