Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handle keyboard interrupt, execute end block

Tags:

powershell

I have a powershell function that processes a list of files. I use the begin, process and end blocks for this:

begin {
    # prepate some stuff
}
process {
    # process each file
}
end {
    # clean up
}

Now, when I hit Ctrl+C, the whole script just terminates right at the spot where it was. That’s not really a problem for the process part as that will only do permanent changes on the very last command.

I do however still want to execute what’s in the end block to clean it up a bit, and to print some statistics about the files that did manage to get processed.

Is there a clean way to catch keyboard interrupts, while keeping the begin/process/end structure?

like image 449
poke Avatar asked Dec 20 '13 17:12

poke


1 Answers

One way to do this would be to disable the processing of Ctrl-C as an interupt while your script block is running. You would have to manually check for it to break out of course but it should guarantee that the end block runs

begin { 
  [Console]::TreatControlCAsInput = $true
}
process {
  # Maybe check for Ctrl-C here to terminate processing
}
end { 
  [Console]::TreatControlCAsInput = $false
}

In order to check for Ctr-C as input in a non-blocking way you can do the following

if ([Console]::KeyAvailable) {
  $key = [Console]::ReadKey($true)
  if ($key.key -eq "C" -and $key.modifiers -eq "Control") { 
    # Clean up and exit
  }
}
like image 129
JaredPar Avatar answered Nov 13 '22 09:11

JaredPar