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?
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
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With