2012-09-05 7 views
13

¿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.Ejemplo que muestra cómo sobrescribir TabExpansion2 en Windows PowerShell 3.0

Respuesta

12

Creo que este ejemplo debería darle un buen punto de partida: Windows Powershell Cookbook: Sample implementation of TabExpansion2. El código de ejemplo muestra que puede agregar código antes y después de las llamadas predeterminadas al [CommandCompletion]::CompleteInput.

Por ejemplo, puede agregar una entrada a la tabla hash $options llamada 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 podrían usarse para completar ese parámetro. Powertheshell.com también tiene un artículo sobre esto: Dynamic Argument Completion. 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 vuelto, puede almacenar el resultado en $result para un análisis posterior. El resultado es una instancia de la clase CommandCompletion. Si la finalización predeterminado No se encontró ninguna coincidencia, se puede añadir sus propias CompletionResult entradas a la lista de coincidencias:

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

No se olvide de volver $result de la función para la terminación ocurre en realidad.

Por último, una nota en la resolución de problemas: el código que llama TabCompletion2 parece aplastar toda la producción basada en la consola (como es lógico), por lo que si desea escribir mensajes de depuración para sí mismo, es posible que trate de escribir en un archivo de texto separado . Por ejemplo, se puede cambiar la función End en TabCopmletion2 a tener este aspecto:

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

¿Está documentado en algún lugar formalmente? ¿Cómo salió originalmente esta información? –

+1

Lamentablemente no he visto ninguna documentación formal, pero me encantaría verla si existe. – Charlie

8

Aquí es un ejemplo de sobrescrito TabExpansion2 - TabExpansion2.ps1 y varios utilizados en los perfiles de práctica con el que finalizaron por ella:

Los puntos de interés:

  • TabExpansion2.ps1 Cómo funciona el mínimo de la carga. La inicialización potencialmente costosa se realiza una vez cuando la finalización realmente ocurre.
  • Anulado TabExpansion2 proporciona un 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 de TabExpansion2.Varios perfiles pueden venir con diferentes módulos independientes, herramientas, etc., y se pueden usar de forma simultánea.
  • Además de que completaron el argumento a medida estándar y que completaron el argumento nativas esta costumbre TabExpansion2 soporta procesadores resultado el que pellizcan los resultados de la incorporada en el terminación y entrada procesadores que puede interceptar y reemplazar la terminación incorporada.
  • Funciona alrededor de los resultados integrados de solo lectura en algunos casos.
  • ArgumentCompleters.ps1 contiene un ejemplo de procesador de entrada que reemplaza la terminación incorporada de tipos y espacios de nombres con una alternativa, más útil a veces.
  • Otra más completa proporciona la terminación de comentarios: etiquetas de ayuda (.Synopsis, .Descripción, etc.) y la finalización de código comentado a cabo, por qué no?
Cuestiones relacionadas