আমি ফাইলের নামটি পাস করে কোনও অ্যাপ্লিকেশন থেকে কীভাবে উইন্ডোটি বন্ধ করব?


9

আমি অ্যাপলস্ক্রিপ্ট-ভিত্তিক শেল কমান্ড তৈরি করার চেষ্টা করছি যা ম্যাক ওএস এক্স থেকে পূর্বনির্ধারিত অ্যাপ্লিকেশনটিকে একটি নির্দিষ্ট উইন্ডোটি বন্ধ করতে বলে।

#!/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 এ সংজ্ঞায়িত একটি উপনাম ব্যবহার করে কমান্ড লাইন থেকে একটি ওএস এক্স অ্যাপ্লিকেশনটি বন্ধ করব?


এটি প্রত্যাশা অনুযায়ী কাজ করা উচিত। আপনি ঠিক কীভাবে আপনার স্ক্রিপ্ট কল করছেন? দ্রষ্টব্য: আপনার স্ক্রিপ্ট কোনও নির্দিষ্ট উইন্ডোটি বন্ধ করবে না। এটি অ্যাপ্লিকেশনটি প্রস্থান করবে, সুতরাং অ্যাপ্লিকেশনটি খোলা থাকতে পারে এমন সমস্ত নথি উইন্ডোটি বন্ধ করে। নির্দিষ্ট দস্তাবেজটি বন্ধ করার জন্য অ্যাপ্লিকেশনটি খোলা হয়েছে তবে প্রতি সেপ্টেম্বর অ্যাপ্লিকেশনটি ছাড়েনি, আপনার আলাদা স্ক্রিপ্ট দরকার need বেশিরভাগ অ্যাপ্লিকেশনগুলি যখন তাদের শেষ নথির উইন্ডোটি বন্ধ থাকে তখন বন্ধ হয়, সমস্তই তা করে না — এটি আপনার ব্যবহৃত ওএস এক্স এর সংস্করণেও নির্ভর করে।
ছিটিয়ে দিন

@ এসএলএইচএইচসি: "অ্যাপ্লিকেশনটি খোলে এমন কোনও নির্দিষ্ট নথি বন্ধ করুন তবে অ্যাপ্লিকেশনটি সেভ করে না" সে ক্ষেত্রে আমার ঠিক এটি দরকার। আপনি কি এমন কোথাও জানবেন যেখানে এই জাতীয় "আলাদা স্ক্রিপ্ট" ব্যাখ্যা করা হয়েছে?
ইভান ডেলানয়

উত্তর:


10

অ্যাপলস্ক্রিপ্ট কমান্ডগুলি গ্রহণ করতে প্রাকদর্শন.অ্যাপ পেয়েছে

ডিফল্টরূপে, অ্যাপলস্ক্রিপ্টিং প্রাকদর্শন কাজ করবে না কারণ প্রাকদর্শন প্রয়োজনীয় অভিধানটি অনুপস্থিত। এটি ঠিক করতে, লরির উত্তরটি এখানে দেখুন , যা 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.pdfঅ্যাপলস্ক্রিপ্টে যেতে চান ।

এখানে আমরা উইন্ডোগুলির মাধ্যমে পুনরাবৃত্তি করি এবং স্ক্রিপ্টে দেওয়া আর্গুমেন্টের বিরুদ্ধে ফাইলের নামগুলি তুলনা করি:

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


কেভেট: অটো-ক্লোজিং প্রিভিউ.অ্যাপ

প্রিভিউ.এপ এই অ্যাপ্লিকেশনগুলির মধ্যে একটি যা এর শেষ ডকুমেন্ট উইন্ডোটি বন্ধ হয়ে গেলে স্বয়ংক্রিয়ভাবে প্রস্থান করে its এটি মেমরি সংরক্ষণ এবং "পরিষ্কার" করার জন্য এটি করে। এই আচরণটি অক্ষম করতে, নিম্নলিখিতটি চালান:

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থেকে কল করতে পারবেন ।


আমি এই চেষ্টা করেছিলাম। এবার আমি কোনও ত্রুটি বার্তা পাই না, তবে স্ক্রিপ্টটি এখনও কাজ করে না: উইন্ডোটি স্ক্রিনে দৃশ্যমান থাকে।
ইয়ান ডেলানয়

এটা আমার জন্য কাজ করেছে। আপনি যদি প্রিভিউ.অ্যাপে কোনও নথি খোলেন, তবে অ্যাপলস্ক্রিপ্ট সম্পাদকটি খুলুন এবং প্রবেশ করুন tell application "Preview" to windows, এটি আপনাকে কোনও ফলাফল দেয়? আপনি কোন সঠিক স্ক্রিপ্টটি চালাচ্ছেন?
slhck

আমি অ্যাপলস্ক্রিপ্ট সম্পাদকটি ব্যবহার করি না, আমি কেবল একটি ব্যাশ স্ক্রিপ্টে "এম্বেডেড অ্যাপলস্ক্রিপ্ট কোড" ব্যবহার করি, যেমন ও.এস. তে বর্ণিত, একটি .sh ফাইলে সঞ্চিত।
ইভান ডেলানয়

আসলে, আমি সাধারণত শেল স্ক্রিপ্টগুলি নিয়ে বেশ খুশি এবং এটি আমার প্রথম অ্যাপ্লিক্রিপ্ট। আমি আপনার সর্বশেষ মন্তব্যে যা পরামর্শ দিয়েছি তা-ই করেছি, এবং একটি উত্তর হিসাবে "" পূর্বরূপ "application" অ্যাপ্লিকেশনটির উইন্ডো আইডি 113 পেয়েছি। এটা কি আমার পাওয়া উচিত?
ইয়ান ডেলানয়

এছাড়াও, আমি যখন << অ্যাপ্লিকেশন সম্পাদকের সাথে "musixdoc.pdf" বন্ধ করতে << অ্যাপ্লিকেশনটিকে "পূর্বরূপ" বলি << >> এটি কোনও কাজ করে না: musixdoc.pdf উইন্ডোটি স্ক্রিনে দৃশ্যমান থাকে।
ইয়ান ডেলানয়

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.