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
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
Hier ist ein Beispiel für überschriebene TabExpansion2
- TabExpansion2.ps1 und mehrere in der Praxis Profile mit Beender dafür verwendet:
- Invoke-Build.ArgumentCompleters.ps1 Argument Beender für Invoke-Build
- Mdbc.ArgumentCompleters.ps1 Argu ment Beender für Mdbc
- ArgumentCompleters.ps1 Argument, Eingabe und Ergebnis Beender
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 aufgerufenTabExpansion2
.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?
Ist das irgendwo formal dokumentiert? Wie sind diese Informationen ursprünglich herausgekommen? –
Leider habe ich keine offizielle Dokumentation gesehen, aber ich würde es gerne sehen, wenn es existiert. – Charlie