net - Ejemplo que muestra cómo sobrescribir TabExpansion2 en Windows PowerShell 3.0
update version powershell (2)
¿Alguien tiene un ejemplo que muestra cómo sobrescribir la función TabExpansion2 en Windows PowerShell 3.0? Sé cómo anular la antigua función TabExpansion, pero quiero proporcionar una lista de elementos para intellisense en PowerShell ISE. Miré la definición de TabExpansion2 y no era fácil de entender cómo inyecté mi propio código en el proceso de expansión de pestañas.
Aquí hay un ejemplo de TabExpansion2
anulada - TabExpansion2.ps1 y varias utilizadas en los perfiles de práctica con completers para él:
- Invoke-Build.ArgumentCompleters.ps1 Argumento completo para Invoke-Build
- Mdbc.ArgumentCompleters.ps1 Argumento completo para Mdbc
- ArgumentCompleters.ps1 Argumento, entrada y finalizadores de resultados
Los puntos de interés:
- TabExpansion2.ps1 hace un trabajo mínimo en la carga. La inicialización potencialmente costosa se realiza una vez cuando la finalización realmente ocurre.
- TapaExpansión2
TabExpansion2
proporciona mecanismo de extensión a través de uno o más perfiles*ArgumentCompleters.ps1
en la ruta. Los perfiles se invocan una vez en la primera llamada deTabExpansion2
. Varios perfiles pueden venir con diferentes módulos independientes, herramientas, etc., y usarse simultáneamente. - Además de los finalizadores de argumentos personalizados estándar y los que completan los argumentos nativos, esta
TabExpansion2
personalizada admite procesadores de resultados que modifican los resultados de los procesadores de finalización y entrada integrados que pueden interceptar y reemplazar la finalización incorporada. - Funciona alrededor de los resultados de lectura solo incorporados en algunos casos.
- ArgumentCompleters.ps1 contiene un ejemplo de un procesador de entrada que reemplaza la finalización incorporada de tipos y espacios de nombres con una alternativa, más útil a veces.
- Otro completer proporciona finalización en los comentarios: etiquetas de ayuda ( .Synopsis , .Description , etc.) y la finalización del código comentado, ¿por qué no?
Creo que este ejemplo debería darle un buen punto de partida: Windows Powershell Cookbook: ejemplo de implementación de TabExpansion2 . El código de ejemplo muestra que puede agregar código antes y después de las llamadas predeterminadas a [CommandCompletion]::CompleteInput
.
Por ejemplo, puede agregar una entrada al hashtable $options
llamado CustomArgumentCompleters para obtener una finalización personalizada para los argumentos del comando. La entrada debe ser una tabla hash donde las claves son nombres de argumento (por ejemplo, "ComputerName" o "Get-ChildItem: Filter") y los valores son matrices de valores que se podrían usar para completar ese parámetro. Powertheshell.com también tiene un artículo sobre esto: Finalización dinámica de argumentos . También puede especificar terminaciones personalizadas para ejecutables nativos, usando la opción NativeArgumentCompleters (de nuevo, las claves son nombres de comando y los valores son matrices de posibles terminaciones).
Una vez que CompleteInput
ha regresado, puede almacenar el resultado en $result
para un análisis posterior. El resultado es una instancia de la clase CommandCompletion
. Si la finalización predeterminada no encontró ninguna coincidencia, puede agregar sus propias entradas CompletionResult
a la lista de coincidencias:
$result.CompletionMatches.Add(
(New-Object Management.Automation.CompletionResult "my completion string") )
No olvide devolver $result
de la función para que la finalización realmente suceda.
Finalmente, una nota sobre solución de problemas: el código que llama a TabCompletion2
parece silenciar toda la salida basada en consola (como es lógico), por lo que si desea escribir mensajes de depuración, intente escribirlos en un archivo de texto aparte. Por ejemplo, puede cambiar la función End
en TabCopmletion2
para que se vea así:
$result = [System.Management.Automation.CommandCompletion]::CompleteInput(
$inputScript, $cursorColumn, $options)
$result | Get-Member | Add-Content "c:/TabCompletionLog.txt"
$result