2012-09-05 10 views
13

Hat jemand ein Beispiel, wie die TabExpansion2-Funktion in Windows PowerShell 3.0 überschrieben wird? Ich weiß, wie die alte TabExpansion-Funktion überschrieben wird, aber ich möchte eine Liste von Elementen für das IntelliSense in PowerShell ISE bereitstellen. Ich habe mir die Definition von TabExpansion2 angeschaut und es war nicht leicht zu verstehen, wie ich meinen eigenen Code in den Tab-Expansionsprozess eingebe.Beispiel zum Überschreiben von TabExpansion2 in Windows PowerShell 3.0

Antwort

12

Ich denke, dieses Beispiel sollte Ihnen einen guten Ausgangspunkt geben: Windows Powershell Cookbook: Sample implementation of TabExpansion2. Der Beispielcode zeigt, dass Sie Code sowohl vor als auch nach den Standardaufrufen [CommandCompletion]::CompleteInput hinzufügen können.

Beispielsweise können Sie der $options Hashtabelle namens CustomArgumentCompleters einen Eintrag hinzufügen, um benutzerdefinierte Vervollständigung für Befehlsargumente zu erhalten. Der Eintrag sollte eine Hashtabelle sein, deren Schlüssel Argumentnamen sind (z. B. "ComputerName" oder "Get-ChildItem: Filter"), und die Werte sind Arrays von Werten, die zur Vervollständigung dieses Parameters verwendet werden können. Powertheshell.com hat auch einen Artikel dazu: Dynamic Argument Completion. Sie können auch benutzerdefinierte Komplettierungen für native ausführbare Dateien mit der Option NativeArgumentCompleters angeben (wiederum sind Schlüssel Befehlsnamen und Werte sind Arrays mit möglichen Komplettierungen). Wenn Sie CompleteInput zurückgegeben haben, können Sie das Ergebnis in $result für weitere Analysen speichern. Das Ergebnis ist eine Instanz der Klasse CommandCompletion. Wenn der Standard-Abschluss keine Übereinstimmungen gefunden haben, können Sie Ihre eigenen CompletionResult Einträge in die Liste der Spiele hinzu:

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

nicht Vergessen $result aus der Funktion zurückzubringen, um tatsächlich die Vollendung geschieht.

Zum Schluss noch ein Hinweis zur Fehlerbehebung: Der Code, der TabCompletion2 aufruft, scheint alle konsolenbasierten Ausgaben zu unterdrücken (nicht überraschend). Wenn Sie also selbst Debugging-Meldungen schreiben möchten, können Sie sie in eine separate Textdatei schreiben . Zum Beispiel könnten Sie die End Funktion in TabCopmletion2 ändern wie folgt aussehen:

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

Ist das irgendwo formal dokumentiert? Wie sind diese Informationen ursprünglich herausgekommen? –

+1

Leider habe ich keine offizielle Dokumentation gesehen, aber ich würde es gerne sehen, wenn es existiert. – Charlie

8

Hier ist ein Beispiel für überschriebene TabExpansion2 - TabExpansion2.ps1 und mehrere in der Praxis Profile mit Beender dafür verwendet:

Die Sehenswürdigkeiten:

  • TabExpansion2.ps1 tut Mindest Arbeit beim Laden. Die potentiell teure Initialisierung wird einmal ausgeführt, wenn die Fertigstellung tatsächlich erfolgt.
  • Überschrieben TabExpansion2 bietet Erweiterungsmechanismus über einen oder mehrere Profile *ArgumentCompleters.ps1 im Pfad. Profile werden beim ersten Aufruf von einmal aufgerufen TabExpansion2.Mehrere Profile können mit verschiedenen unabhängigen Modulen, Werkzeugen usw. geliefert werden und gleichzeitig verwendet werden.
  • Neben Standard benutzerdefinierten Argument Beender und nativer Argument Beender Diese benutzerdefinierten TabExpansion2 unterstützt Ergebnis Prozessoren, die die Ergebnisse aus der Einbau-Abschluss und Eingabeprozessoren zwicken, die die Einbau-Abschluss kann abzufangen und ersetzen.
  • Es funktioniert in einigen Fällen um nur Lese-leere integrierte Ergebnisse.
  • ArgumentCompleters.ps1 enthält ein Beispiel für einen Eingangsprozessor, der die eingebaute Vervollständigung von Typen und Namespaces durch eine alternative, nützlichere manchmal ersetzt.
  • Ein weiterer completer bietet Fertigstellung in den Kommentaren: Hilfe-Tags (.Synopsis, .Beschreibung, etc.) und Abschluss der Kommentar gesetzt Code, warum nicht?
Verwandte Themen