मैं एक एप्लिकेशन से एक विंडो कैसे बंद करूं, फ़ाइल नाम पास करना?


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)

संबंधित प्रश्न: मैं अपने .bash_profile में परिभाषित उपनाम के उपयोग से कमांड लाइन से OS X एप्लिकेशन को कैसे बंद कर सकता हूं?


यह उम्मीद के मुताबिक काम करना चाहिए। आप अपनी स्क्रिप्ट को कैसे बुला रहे हैं, बिल्कुल? नोट: आपकी स्क्रिप्ट किसी विशेष विंडो को बंद नहीं करेगी। यह एप्लिकेशन को छोड़ देगा, इस प्रकार सभी डॉक्यूमेंट विंडो को बंद करने से एप्लिकेशन ओपन हो सकता है। किसी विशेष दस्तावेज़ को बंद करने के लिए आवेदन खोला गया है, लेकिन प्रति सेगमेंट में आवेदन नहीं छोड़ा है, आपको एक अलग स्क्रिप्ट की आवश्यकता है। जबकि अधिकांश एप्लिकेशन अपनी अंतिम दस्तावेज़ विंडो बंद होने पर छोड़ देते हैं, सभी ऐसा नहीं करते हैं - यह भी आपके द्वारा उपयोग किए जा रहे OS X के संस्करण पर निर्भर करता है।
19

@ एसएलएचएचके: "एक विशेष दस्तावेज़ को बंद करें जो एप्लिकेशन ने खोला है, लेकिन प्रति सेग्मेंट को नहीं छोड़ना है" ठीक वही है जो मुझे चाहिए। क्या आपको ऐसा कहीं पता है जहाँ इस तरह की "अलग लिपि" समझाई जाती है?
इवान डेलानॉय

जवाबों:


10

AppleScript आदेशों को स्वीकार करने के लिए Preview.app प्राप्त करना

डिफ़ॉल्ट रूप से, AppleScripting पूर्वावलोकन काम नहीं करेगा क्योंकि पूर्वावलोकन आवश्यक शब्दकोश को याद कर रहा है। इसे ठीक करने के लिए, लॉरी के उत्तर को यहां देखें , जो NSAppleScriptEnabledप्रीव्यू.एप के लिए सेटिंग की व्याख्या करता है।

प्रीव्यू छोड़ें। टैप करें, फिर एक टर्मिनल खोलें और दर्ज करें:

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) फ़ाइल नाम से

यदि आप एक विंडो को बंद करना चाहते हैं जो एक निश्चित दस्तावेज़ से संबंधित है, लेकिन फ़ाइल नाम की आपूर्ति करते हुए, आपको कुछ और चाहिए। ऐसा इसलिए है क्योंकि एक बहु-पृष्ठ पीडीएफ के रूप में प्रदर्शित किया जा सकता है foo.pdf (Page 1 of 42), लेकिन आप बस foo.pdfAppleScript को पास करना चाहते हैं ।

यहाँ हम खिड़कियों के माध्यम से पुनरावृत्ति करते हैं और स्क्रिप्ट के पास दिए गए तर्क के खिलाफ फ़ाइल नाम की तुलना करते हैं:

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


कैविएट: ऑटो-क्लोजिंग प्रीव्यू.ऐप

प्रीव्यू.ऐप इन एप्लिकेशनों में से एक है जो अपने आखिरी डॉक्यूमेंट विंडो के बंद होने के बाद अपने आप क्विट हो जाता है। यह स्मृति को बचाने और "साफ" करने के लिए करता है। इस व्यवहार को अक्षम करने के लिए, निम्नलिखित चलाएँ:

defaults write -g NSDisableAutomaticTermination -bool TRUE

बेशक, कि, परिवर्तन को पूर्ववत करने TRUEके लिए FALSE


स्क्रिप्ट के बजाय फ़ंक्शंस का उपयोग करना

अंत में, मैं आपकी स्क्रिप्ट को एक ऐसे फंक्शन में डालने का सुझाव दूंगा जो आपके शेल में हमेशा उपलब्ध हो। ऐसा करने के लिए, स्क्रिप्ट को अपने में जोड़ें ~/.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
}

एक बार जब आप अपने बैश प्रोफाइल को बचा लेते हैं और शेल को पुनरारंभ करते हैं, तो आप cw Preview foo.pdfहर जगह से कॉल कर सकते हैं ।


मैंने यह कोशिश की। इस बार मुझे कोई त्रुटि संदेश नहीं मिला, लेकिन स्क्रिप्ट अभी भी काम नहीं कर रही है: खिड़की स्क्रीन पर दिखाई देती है।
इवान डेलानॉय

इसने मेरे लिए काम किया। यदि आप Preview.app में कोई दस्तावेज़ खोलते हैं, तो AppleScript संपादक खोलें, और दर्ज करें tell application "Preview" to windows, क्या यह आपको कोई परिणाम देता है? आप कितनी सटीक स्क्रिप्ट चला रहे हैं?
स्लैक

मैं AppleScript एडिटर का उपयोग नहीं करता, मैं केवल बैश स्क्रिप्ट में "एम्बेडेड एप्सस्क्रिप्ट कोड" का उपयोग करता हूं, जैसा कि ओपी में समझाया गया है, एक एश फाइल में संग्रहीत है।
इवान डेलानॉय

वास्तव में, मैं आमतौर पर शेल स्क्रिप्ट से काफी खुश हूं और यह मेरी पहली एप्सस्क्रिप्ट है। मैंने वही किया जो आपने अपनी अंतिम टिप्पणी में दिया था, और उत्तर: "{विंडो आईडी 113 ऑफ़ एप्लीकेशन" प्रीव्यू "}" एक उत्तर के रूप में। क्या वह है जो मुझे मिलना चाहिए?
इवान डेलानॉय

इसके अलावा, जब मैं संकलित करता हूं << एप्लिकेशन "पूर्वावलोकन" को "musixdoc.pdf" को बंद करने के लिए कहता हूं >> Applescript संपादक के साथ, यह या तो काम नहीं करता है: musixdoc.pdf विंडो स्क्रीन पर दिखाई देती है।
इवान डेलानॉय

0

स्लॉक का जवाब अच्छा और पूरी तरह से दिखता है। खबरदार, तीसरी कोड लाइन निष्पादित करना :

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इस मामले में 'कोड को दिए गए पथ पर हस्ताक्षर करना' है ...-

जाहिर है, पूर्वावलोकन अब गलत तरीके से हस्ताक्षरित और अनुपयोगी है। :(

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.