处理键盘中断,执行结束块

pok*_*oke 5 powershell

我有一个powershell函数来处理文件列表.我使用begin,processend块为此:

begin {
    # prepate some stuff
}
process {
    # process each file
}
end {
    # clean up
}
Run Code Online (Sandbox Code Playgroud)

现在,当我点击时Ctrl+C,整个脚本就会终止于它所在的位置.这对于流程部分来说并不是一个问题,因为它只会对最后一个命令进行永久性更改.

但是我仍然想要执行end块中的内容来清理它,并打印一些有关已经设法处理的文件的统计信息.

是否有一种干净的方法来捕获键盘中断,同时保持开始/进程/结束结构?

Jar*_*Par 6

一种方法是Ctrl-C在脚本块运行时禁用作为中断的处理。您当然必须手动检查它是否会中断,但它应该保证结束块运行

begin { 
  [Console]::TreatControlCAsInput = $true
}
process {
  # Maybe check for Ctrl-C here to terminate processing
}
end { 
  [Console]::TreatControlCAsInput = $false
}
Run Code Online (Sandbox Code Playgroud)

为了以Ctr-C非阻塞方式检查输入,您可以执行以下操作

if ([Console]::KeyAvailable) {
  $key = [Console]::ReadKey($true)
  if ($key.key -eq "C" -and $key.modifiers -eq "Control") { 
    # Clean up and exit
  }
}
Run Code Online (Sandbox Code Playgroud)