2013-07-12 4 views
10

मैं करने की कोशिश क्या:कैसे AppleScript साथ frontmost ऐप्लिकेशन के नाम पर मिलता है और इसका इस्तेमाल filepath पाने के लिए करने के लिए

जब मैं अपने पाठ संपादक में से एक (TextEdit, घृणा का पात्र, FoldingText) में हूँ मैं चाहता हूँ फ़ाइल पथ को प्रदर्शित करने के लिए यह ऐप्पलस्क्रिप्ट।

मैं frontmost खिड़की एप्लिकेशन के लिए पूछ मिल क्षुधा अच्छा नाम और आसानी से और उसके बाद मैं अगले कदम में POSIX पथ के लिए पूछ सकते मैं हूँ लगा।

समस्या:

स्क्रिप्ट पहले से ही 99% वहाँ है, लेकिन मैं कुछ याद कर रहा हूँ। यह काम जब मैं activeApp की चर का उपयोग करने की कोशिश करता है और मैं इस त्रुटि मिलती है:

Error Number:System Events got an error: Can’t get application {"TextEdit"}. 
-1728 

यहाँ स्क्रिप्ट है:

tell application "System Events" 
    set activeApp to name of application processes whose frontmost is true 

    --This doesn't work either: 
    --do shell script "php -r 'echo urldecode(\"" & activeApp & "\");'" 

    tell application activeApp 
     set myPath to POSIX path of (get file of front document) 
    end tell 
    display dialog myPath 
end tell 

अगर मैं activeApp साथ "TextEdit" सब कुछ काम करता है का आदान-प्रदान। मदद की सराहना की जाएगी।

हो सकता है कि वहाँ यहाँ में कुछ है कि मदद करता है है: Get process name from application name and vice versa, using Applescript

उत्तर

7

या तो एक दस्तावेज़ के path संपत्ति पाने या सिस्टम ईवेंट का उपयोग पाने के लिए value of attribute "AXDocument":

try 
    tell application (path to frontmost application as text) 
     (path of document 1) as text 
    end tell 
on error 
    try 
     tell application "System Events" to tell (process 1 where frontmost is true) 
      value of attribute "AXDocument" of window 1 
     end tell 
     do shell script "x=" & quoted form of result & " 
     x=${x/#file:\\/\\/} 
     x=${x/#localhost} # 10.8 and earlier 
     printf ${x//%/\\\\x}" 
    end try 
end try 

पहली विधि पूर्वावलोकन, TextMate 2, उदात्त पाठ, या iChm, और दूसरा विधि के साथ काम नहीं किया Acorn के साथ काम नहीं किया। दूसरी विधि को सहायक उपकरणों को सक्षम करने के लिए उपयोग की आवश्यकता है।

set front_app to (path to frontmost application as Unicode text) 

tell application front_app 
    -- Your code here 
end tell 
+0

प्रयास भाग बस महान है। बहुत ही लचीला और सही पथ को आउटपुट करने के लिए सभी अलग-अलग ऐप्स प्राप्त करने के बहुत कम हाथ का काम (जैसे ही मैंने इसका परीक्षण किया, IF शर्तों को लिखना बंद कर दिया)। Apropos, "अगर" मैं इसे nvALT के साथ काम करने के लिए मिल सकता है तो मेरे पास वांछित से भी अधिक है। – pattulus

+0

यदि आप नाम "nvALT" है ((सिस्टम विशेषता "HOME") और "/ नोट्स" और टेक्स्ट फ़ील्ड का मान है, तो आप 'बताएं एप्लिकेशन "सिस्टम इवेंट्स जैसे कुछ कह सकते हैं (प्रक्रिया 1 जहां सबसे आगे सत्य है) विंडो 1 और ".txt" के टूल बार 1 के समूह 1 में से 1)। – user495470

+1

यह अच्छा है। धन्यवाद। लेकिन जब मैं स्क्रिप्ट चलाता हूं तो यह पथ की शुरुआत में पाठ को हटा देता है, इसलिए '/ उपयोगकर्ता/उपयोगकर्ता नाम/पथ/से/फ़ाइल' 'उपयोगकर्ता नाम/पथ/से/फ़ाइल' बन जाता है। कोई विचार क्यों? – drstevok

1

आप के लिए ...

set activeApp to name of application processes whose frontmost is true 

सूचना "प्रक्रियाओं" कह रहे हैं, कि बहुवचन अर्थ आप प्रतिक्रिया इतनी applescript में कई प्रक्रियाओं प्राप्त कर सकते हैं आपको नामों की एक सूची देता है। भले ही केवल एक आवेदन लौटाया गया है, फिर भी यह सूची प्रारूप में है। यह भी देखें कि आपकी त्रुटि में {"TextEdit"} है। नाम के आस-पास के ब्रैकेट का अर्थ यह एक सूची है, इसलिए त्रुटि आपको समस्या दिखा रही है।

आप कोड की अगली पंक्ति में नामों की सूची पारित नहीं कर सकते हैं। जैसे आपके पास कुछ विकल्प हैं। 1) आप सभी प्रक्रियाओं के बजाय केवल 1 प्रक्रिया के लिए पूछ सकते हैं। वह एक सूची के बजाय एक स्ट्रिंग वापस करेगा। इस कोड को आजमाएं ...

set activeApp to name of first application process whose frontmost is true 

2) आप "सूची के आइटम 1" का उपयोग कर सूची के साथ काम कर सकते हैं। इस कोड को आज़माएं ...

set activeApps to name of application processes whose frontmost is true 
set activeApp to item 1 of activeApps 

अंत में, आपको एप्लिकेशन को बताने के लिए सिस्टम ईवेंट नहीं कहना चाहिए। कोड के ब्लॉक 2 उनको अलग करें। यहां बताया गया है कि मैं आपका कोड कैसे लिखूंगा।

tell application "System Events" 
    set activeApp to name of first application process whose frontmost is true 
end tell 

try 
    tell application activeApp 
     set myPath to POSIX path of (get file of front document) 
    end tell 

    tell me 
     activate 
     display dialog myPath 
    end tell 
on error theError number errorNumber 
    tell me 
     activate 
     display dialog "There was an error: " & (errorNumber as text) & return & return & theError buttons {"OK"} default button 1 with icon stop 
    end tell 
end try 

मैं "फ्रंट दस्तावेज़ की फ़ाइल प्राप्त करने" कोड का वादा नहीं कर सकता। यह आवेदन पर निर्भर करता है। सभी एप्लिकेशन उस अनुरोध को समझ नहीं पाएंगे। यही कारण है कि मैंने एक कोशिश ब्लॉक का इस्तेमाल किया। किसी भी मामले में हालांकि आप निश्चित हो सकते हैं कि आप उचित आवेदन को संबोधित कर रहे हैं। सौभाग्य।

+0

प्रक्रिया के बहुवचन पर मुझे सही करने के लिए धन्यवाद ... मैंने इसके बारे में सोचा नहीं था। मैं अभी भी मूल बातें सीख रहा हूं (कल मैं एक सूची ऐप्पलस्क्रिप्ट पर काम कर रहा था और यहां घुंघराले ब्रेसिज़ प्राप्त करने से मुझे आश्चर्य हुआ)। // इसके अतिरिक्त मैंने अब आपके द्वारा सुझाए गए दो हिस्सों को अलग कर दिया है। फिर भी मुझे कोई भाग्य नहीं है। // मैंने आपकी स्क्रिप्ट की प्रतिलिपि बनाई और इसे मेरे टेक्स्ट संपादकों पर आजमाया लेकिन अभी भी -1728 समस्या है। – pattulus

+0

मैंने कोड अपडेट किया ... मैं "पहली एप्लिकेशन प्रक्रिया का नाम भूल गया" तो कृपया पुनः प्रयास करें। – regulus6633

+0

मैंने अपने विवरण को बेहतर तरीके से समझाया जो मैं कर रहा हूं। अफसोस की बात है कि "पहले का नाम" त्रुटि के एक प्रकार को आउटपुट करता है: "त्रुटि" ऐप्पलस्क्रिप्ट संपादक को एक त्रुटि मिली: दस्तावेज़ 1 की फ़ाइल नहीं मिल सकती है। "दस्तावेज़ 1 की फ़ाइल से संख्या -1728" – pattulus

1

मैं थोड़ी देर के लिए इस स्निपेट का उपयोग कर रहे हैं, और सभी कोको क्षुधा (सुनिश्चित करें कि X11 के बारे में नहीं) के लिए काम करने लगता है और डॉक पर रखा। जब भी आप एप्लिकेशन चलाते हैं, आईटी सबसे आगे है, न कि एप्लिकेशन जो इसकी फ्रंट विंडो दिखा रहा है। यह एप्लिकेशन निष्क्रिय हो जाता है क्योंकि मेरे एप्पलस्क्रिप्ट चलाता है। मैं एक एप्पलस्क्रिप्ट एप्लिकेशन कैसे लिखूं जो सक्रिय होने पर सक्रिय नहीं है?

मुझे ऊपर सूचीबद्ध समस्या का समाधान मिल सकता है। बस वांछित आवेदन को पुनः सक्रिय करने के लिए उपयोगकर्ता को बताएं, और उन्हें समय दें।

tell application "Finder" 
    activate 
    say "Click front window of your application" 
    delay 5 
    set myapp to get name of first application process whose frontmost is true 
-- etc. 
-- your code 
end tell 
+0

योगदान के लिए धन्यवाद , लेकिन यह केवल ऐप प्राप्त करता है, लेकिन सक्रिय/सामने वाला दस्तावेज़ नहीं। – pattulus

0

इस में से कोई भी एक संकलित AppleScript एक आवेदन के रूप में सहेजा के साथ काम करने लगता है:

संबंधित मुद्दे