2012-04-16 12 views
9

¿Esto es posible? Finalmente decidí comenzar a configurar mi entorno personal de desarrollo .NET para imitar más de cerca cómo configuré un entorno de desarrollo * NIX, lo que significa aprender Powershell en serio.¿Cómo atrapo las señales en PowerShell?

Actualmente estoy escribiendo una función que se repite a través del sistema de archivos, estableciendo el directorio de trabajo tal como está para construir cosas. Una pequeña cosa que me molesta es que si Ctrl + C fuera de la función, me deja dondequiera que haya estado la última secuencia de comandos. Intenté establecer un bloque trap que cambia el directorio al punto de partida cuando se ejecuta, pero parece que solo está previsto (y dispara) en Excepción.

Si esto estuviera en un idioma que tenía raíz en Unix, configuraría un manejador de señal para SIGINT, pero no puedo encontrar nada similar buscando en Powershell. Poniendo mi capa de .NET, me imagino que hay algún tipo de evento al que puedo adjuntar un controlador, y si tuviera que adivinar, sería un evento de $host, pero no puedo encontrar ninguna documentación canónica para System.Management.Automation.Internal.Host.InternalHostUserInterface, y nada anecdótico que haya podido buscar ha sido útil.

Quizás me falta algo completamente obvio?

Respuesta

16

¿Te refieres a algo como esto?

try 
{ 
    Push-Location 
    Set-Location "blah" 
    # Do some stuff here 
} 

finally 
{ 
    Pop-Location 
} 

Véase la documentación here. Particularmente ese párrafo: ". El último bloque de declaraciones se ejecutan independientemente de si el bloque Try encuentra un error de terminación de Windows PowerShell ejecuta el último bloque antes de termina la secuencia de comandos o antes de que el bloque actual se sale de ámbito de aplicación. un último bloque se ejecuta incluso si se utiliza CTRL + C para detener el script. un último bloque también se ejecuta si una palabra clave de la salida se detiene la secuencia de comandos desde dentro de un bloque Catch. "

+2

Finalmente una solución recta hacia adelante para limpiar un CTRL-C terminada Trabajo (: – Callahan

5

Este se encarga de entrada de la consola kepboard. Si se presiona el control C durante el ciclo, tendrá la oportunidad de manejar el evento como lo desee. En el código de ejemplo, se imprime una advertencia y se sale del ciclo.

[console]::TreatControlCAsInput = $true 
dir -Recurse -Path C:\ | % { 
    # Process file system object here... 
    Write-Host $_.FullName 

    # Check if ctrl+C was pressed and quit if so. 
    if ([console]::KeyAvailable) { 
     $key = [system.console]::readkey($true) 
     if (($key.modifiers -band [consolemodifiers]"control") -and ($key.key -eq "C")) { 
      Write-Warning "Quitting, user pressed control C..." 
      break 
     } 
    } 
+0

no funciona desde el ISE, pero perfecto en una ventana normal PowerShell – Froosh

Cuestiones relacionadas