2012-09-05 17 views
13

में TabExpansion2 को ओवरराइड करने का तरीका दिखाता है क्या किसी के पास Windows PowerShell 3.0 में TabExpansion2 फ़ंक्शन को ओवरराइड करने का एक उदाहरण है? मुझे पता है कि पुराने TabExpansion फ़ंक्शन को ओवरराइड कैसे करें, लेकिन मैं PowerShell ISE में इंटेलिजेंस के लिए आइटम्स की एक सूची प्रदान करना चाहता हूं। मैंने TabExpansion2 की परिभाषा को देखा और यह आसानी से समझ में नहीं आया कि मैं टैब विस्तार प्रक्रिया में अपना कोड कैसे इंजेक्ट करता हूं।उदाहरण दिखा रहा है कि Windows PowerShell 3.0

उत्तर

12

मुझे लगता है कि इस उदाहरण से आपको एक अच्छा प्रारंभिक बिंदु देना चाहिए: Windows Powershell Cookbook: Sample implementation of TabExpansion2। उदाहरण कोड दिखाता है कि आप [CommandCompletion]::CompleteInput पर डिफ़ॉल्ट कॉल के पहले और बाद में दोनों कोड जोड़ सकते हैं।

उदाहरण के लिए, आप कमांड तर्कों के लिए कस्टम समापन प्राप्त करने के लिए $options हैशटेबल में कस्टम एर्ग्यूमेंट कॉम्प्लेटर्स में एक प्रविष्टि जोड़ सकते हैं। प्रविष्टि एक हैशटेबल होना चाहिए जहां कुंजी तर्क नाम हैं (उदा। "कंप्यूटर नाम" या "गेट-चाइल्डइटम: फ़िल्टर") और मान मानों के सरणी हैं जिनका उपयोग पैरामीटर को पूरा करने के लिए किया जा सकता है। Powertheshell.com के बारे में भी एक लेख है: Dynamic Argument Completion। आप मूल निष्पादन योग्य विकल्पों के लिए मूल निष्पादन के लिए कस्टम समापन भी निर्दिष्ट कर सकते हैं, फिर से, कुंजी कमांड नाम हैं और मान संभावित समापन के सरणी हैं)।

एक बार CompleteInput वापस आ गया है, तो आप परिणाम को आगे विश्लेषण के लिए $result में संग्रहीत कर सकते हैं। नतीजा CommandCompletion वर्ग का एक उदाहरण है। डिफ़ॉल्ट पूरा होने के कोई भी मैच नहीं मिला है, तो आप मैचों की सूची में अपने स्वयं CompletionResult प्रविष्टियों जोड़ सकते हैं:

$result.CompletionMatches.Add(
    (New-Object Management.Automation.CompletionResult "my completion string")) 

समारोह से $result वापस जाने के लिए तो पूरा होने वास्तव में होता है मत भूलना।

अंत में, समस्या निवारण पर एक नोट: TabCompletion2 पर कॉल करने वाला कोड सभी कंसोल-आधारित आउटपुट (आश्चर्य की बात नहीं) को घुमाता है, इसलिए यदि आप अपने लिए डिबगिंग संदेश लिखना चाहते हैं, तो आप उन्हें एक अलग टेक्स्ट फ़ाइल में लिखने का प्रयास कर सकते हैं । उदाहरण के लिए, आप इस तरह देखने के लिए TabCopmletion2 में End समारोह को बदल सकता है:

$result = [System.Management.Automation.CommandCompletion]::CompleteInput(
    $inputScript, $cursorColumn, $options) 
$result | Get-Member | Add-Content "c:\TabCompletionLog.txt" 
$result 
+0

क्या यह औपचारिक रूप से कहीं भी दस्तावेज है? यह जानकारी मूल रूप से कैसे निकली? –

+1

अफसोस की बात है कि मैंने कोई औपचारिक दस्तावेज नहीं देखा है, लेकिन अगर यह मौजूद है तो मुझे इसे देखना अच्छा लगेगा। – Charlie

8

यहाँ ओवरराइड TabExpansion2 का एक उदाहरण है - TabExpansion2.ps1 और कई इसके लिए completers साथ अभ्यास प्रोफाइल में प्रयोग किया है:

दिलचस्पी की बात जाहिर completers:

  • TabExpansion2.ps1 लोड हो रहा है पर कम से कम काम करता है। संभावित रूप से महंगा होने पर संभावित रूप से महंगा प्रारंभिकता एक बार किया जाता है।
  • ओवरराइड TabExpansion2 पथ में एक या अधिक प्रोफाइल *ArgumentCompleters.ps1 के माध्यम से विस्तार तंत्र प्रदान करता है। TabExpansion2 की पहली कॉल पर प्रोफ़ाइल पर एक बार लागू की जाती है।कई प्रोफ़ाइल विभिन्न स्वतंत्र मॉड्यूल, उपकरण, आदि के साथ आ सकती हैं और साथ ही साथ उपयोग की जाती हैं।
  • मानक कस्टम तर्क completers और देशी तर्क completers इस कस्टम TabExpansion2 के अलावा परिणाम प्रोसेसर है जहाँ से परिणाम tweak का समर्थन करता है निर्मित में पूरा करने और इनपुट प्रोसेसर जो रोकना और निर्मित में पूरा करने की जगह ले सकता।
  • यह कुछ मामलों में केवल खाली अंतर्निहित परिणामों को पढ़ने के आसपास काम करता है।
  • ArgumentCompleters.ps1 एक इनपुट प्रोसेसर डायन का एक उदाहरण में निर्मित एक विकल्प के साथ प्रकार और नामस्थान के पूरा होने, और अधिक उपयोगी की जगह कभी कभी होता है। , मदद टैग (.Synopsis, .Description, आदि) और बाहर टिप्पणी की कोड के पूरा क्यों नहीं:
  • एक और Completer टिप्पणी में पूरा होने प्रदान करता है?
संबंधित मुद्दे