Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
2.3k views
Welcome To Ask or Share your Answers For Others

1 Answer

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
  }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...