2012-05-03 9 views
5

मेरे ऐप में, मुझे ओएसएक्स फ़ाइंडर एक फाइल या फ़ोल्डर कॉपी करना पसंद है।खोजक और एप्पलस्क्रिप्ट के माध्यम से आइटम कॉपी करें: "आइटम मौजूद कैसे है - प्रतिस्थापित करें?" खोजक में संवाद?

(नोट:। मैं खोजकर्ता का उपयोग करके बजाय खोल cmds, NSWorkspace या अन्य साधनों का उपयोग कर के लिए अच्छे कारण है, इसलिए कोई जरूरत उस दिशा में सुझाव के लिए वहाँ)

मैं वर्तमान के लिए Apple स्क्रिप्ट पर भरोसा कर रहा हूँ खोज ऑपरेटर को कॉपी ऑपरेशन करने के लिए कहा। यहां परीक्षण के लिए एक नमूना स्क्रिप्ट है:

tell application "Finder" 
    try 
     copy file POSIX file "/etc/bashrc" to folder POSIX file "/private/tmp" 
     -- alternative with same behavior: 
     --duplicate POSIX file "/etc/bashrc" to POSIX file "/private/tmp" 
    on error errmesg number errn 
     display dialog "Error thrown: " & errmesg 
    end try 
end tell 

अब समस्या यह है: गंतव्य आइटम पहले से मौजूद हैं, तो स्क्रिप्ट एक त्रुटि फेंकता है और प्रति आपरेशन रोक देता है।

हालांकि, मैं नहीं बल्कि खोजक प्रदर्शित होता है "आइटम मौजूद है" संवाद कि यह पता चलता है जब इस तरह के एक प्रतिलिपि आपरेशन इस तरह सहभागी खोजक में कर रही है, अब

Finder "item already exists" warning

, यहां बात है: यदि मैं इस स्क्रिप्ट को तृतीय पक्ष ऐप स्क्रिप्ट डीबगर से चलाता हूं, तो यह संवाद प्रकट होता है!

तो, जाहिर है कि खोजक को अपवाद फेंकने के बजाय संवाद प्रदर्शित करने का एक तरीका है। पर कैसे? इस रहस्य को कौन जानता है?

+0

आप जांच सकते हैं कि गंतव्य फ़ाइल पहले मौजूद है या नहीं और इस मामले को स्वयं संभालें? –

+0

पॉल - बेशक मैं कर सकता था, लेकिन यह इस प्रश्न या स्थिति को हल करने के लिए प्रासंगिक नहीं है। –

+0

क्षमा करें - मैंने सोचा कि यह एक व्यावहारिक समाधान हो सकता है यदि खोजक से आवश्यक व्यवहार प्राप्त करने का कोई तरीका नहीं है। –

उत्तर

0

ऐसा लगता है कि वास्तव में ऐप्पलस्क्रिप्ट का उपयोग करते समय खोजकर्ता को संवाद दिखाने का कोई तरीका नहीं है - कम से कम जब स्क्रिप्ट अपने नियमित वातावरण में चलती है। मेरे परीक्षण में, दोनों खोजक की और प्रणाली घटनाक्रम 'फ़ाइल move लगातार आदेश बाहर त्रुटि जब लक्ष्य पहले से मौजूद है - फर्क सिर्फ इतना किया जा रहा है, अर्थ विज्ञान के अलावा, कि खोजक true के साथ इस व्यवहार को दबाने के लिए एक replacing स्विच प्रदान करता है जिसका अर्थ है कि लक्ष्य फ़ाइल को बिना संकेत दिए ओवरराइट किया जाएगा, लेकिन इसे ask पर सेट करने का कोई विकल्प नहीं है (सटीक उसी प्रश्न की चर्चा के लिए this MacScripter thread देखें)।

अपने अंदरूनी कामकाज की कड़ी ज्ञान के बिना, मैं केवल अनुमान इस तथ्य Script Debugger इस अलग तरह से संभालती है की वजह से यह नहीं सामान्य वातावरण में स्क्रिप्ट चला सबसे अधिक संभावना है खतरे कर सकते हैं। यह कल्पना करना मुश्किल है कि यह अपनी स्क्रिप्ट निष्पादन परत बनाने के बिना डीबगर के रूप में अपनी नौकरी करने के लिए एक स्क्रिप्ट के आंतरिक कार्यों में कैसे लगाएगा। इस तरह की एक मध्यस्थ परत व्याख्या कर सकती है कि आदेशों को अलग-अलग क्यों अग्रेषित किया जाता है - फाइंडर के मामले में और move, निम्न स्तर की खोजक प्रति दिनचर्या में, जो संवाद दिखाएगा।

जो आपको कार्यक्षमता को फिर से कार्यान्वित करने के साथ छोड़ देता है, as suggested by Paul R, या AppleScript-ObjectiveC पर जा रहा है (विशेषज्ञता का मेरा क्षेत्र नहीं, मुझे डर है)।

+0

मैंने इसके बारे में Latenightsw को एक प्रश्न भी भेजा है। शायद वे मुझे बता सकते हैं कि क्या हो रहा है। हालांकि, अभी भी एक anwser पर इंतजार कर रहा है। कुछ समय पहले मैंने एक प्रश्न भी पोस्ट किया जहां एसडी ने बाकी की तुलना में कुछ ज्यादा चालाक किया, और लोगों ने सुझाव दिया कि एसडी ने कुछ किया है। यह पता चला कि यह अंत में आधिकारिक एपीआई के अनुरूप था। तो मुझे भरोसा है कि एसडी इस मामले में नियमों के साथ ही खेलता है। मुझे यह भी इंगित करना चाहिए कि मैं गैर-डीबगिंग मोड में एसडी में परीक्षण चला रहा हूं। हम देखेंगे ... –

+0

बीटीडब्लू, मैंने एई घटनाओं को भी देखा - वे एसडी और ऐप्पल के संपादक के बीच समान दिखते हैं। हो सकता है कि यह कुछ पर्यावरण सेटिंग है जिसे मैं अभी नहीं देख सकता, जैसे कि एसडी एक नए एसडीके के खिलाफ बनाया गया था, इस सुविधा को स्वचालित रूप से सक्षम करता है (मैंने ओएसएक्स पर पहले ऐसी चीजें देखी हैं)। –

+0

@ थॉमस टेम्पेलमैन: ओह, मैं सुझाव नहीं देना चाहता कि एसडी कुछ अनियंत्रित करता है - बस यह तथ्य कि स्क्रिप्ट और घटना प्रणाली के बीच खुद को पार करता है, जिसके परिणामस्वरूप कुछ कॉलों का अलग-अलग अनुवाद किया जा सकता है (हालांकि यदि आपको वही मिलता है तो यह असंभव लगता है एई)। वैसे भी, अगर आप एक प्राप्त करते हैं तो मुझे उनका जवाब सुनना अच्छा लगेगा - आपके बाद के व्यवहार को पाने का कोई तरीका अच्छा होगा। – kopischke

-1

यह देर से हो सकता है, लेकिन यदि आप फ़ाइल को नष्ट इससे पहले कि आप कॉपी की जगह के रूप में यह thats एक ही:

tell application "System Events" 
    if exists file ("NewFilePath") then 
     delete file ("NewFilePath") 
      -- NewFilePath Is where the file will end up or already is 
    end if 
end tell 
tell application "Finder" 
    try 
     copy file POSIX file "FilePath" to folder POSIX file "FolderPath" 
     -- FilePath is where it is now 
     -- FolderPath is the path of the folder you want the file in 
    on error errmesg number errn 
     display dialog "Error thrown: " & errmesg 
    end try 
end tell 

और थेरेस के बाद से बदलने के लिए या खोजक रोक के बीच कोई विकल्प नहीं इस तरह के एक खिड़की को लाने नहीं करना चाहिए

+0

लेकिन जब आवश्यक हो तो मैं "क्या आप निश्चित हैं" संवाद प्रकट करने के लिए _want_, ताकि उपयोगकर्ता मौजूदा आइटम को प्रतिस्थापित करने के लिए चुन सकें। और अपना खुद का चेक जोड़ना और फिर अपना खुद का संवाद दिखाना अन्य कारणों से संभव नहीं है, मैं कुछ शब्दों में व्याख्या नहीं कर सकता हूं। –

1

ठीक है, मेरी अपनी ज़रूरतों के लिए मुझे एक समाधान मिला है: ऐप्पलस्क्रिप्ट का उपयोग करने के बजाय, मुझे AppleEvents API का उपयोग सीधे करने की आवश्यकता है।

वहां, मैं मूल्य kAEAlwaysInteract | kAECanSwitchLayerAESend के SendMode पैरामीटर की आपूर्ति कर सकता हूं। यह फाइंडर में संवाद प्रकट करता है (और इस मामले में खोजक को सामने लाता है)।

किसी के लिए ऐप्पलस्क्रिप्ट पर भरोसा करने के लिए, दुर्भाग्यवश, यह समाधान नहीं है।