这可能吗?我终于决定开始建立我个人的.NET开发环境,以更接近地模仿我如何建立一个* NIX开发环境,这意味着要认真学习Powershell。
我正在编写一个函数,它通过文件系统进行递归,设置工作目录,以便构建东西。困扰我的一件小事是,如果我将Ctrl + C排除在函数之外,它会让我离开脚本最后的位置。我已经尝试设置一个trap
块,在运行时将dir更改为起始点,但这似乎只是在Exception上打算(和触发)。
如果这是一种在Unix中具有root权限的语言,我会为SIGINT
设置一个信号处理程序,但我在Powershell中找不到任何类似的搜索。戴上我的.NET上限,我想象有一些事件,我可以附加一个处理程序,如果我不得不猜测,它是$host
的事件,但我找不到System.Management.Automation.Internal.Host.InternalHostUserInterface
的任何规范性文档,并且我能够搜索的任何轶事都没有帮助。
也许我错过了一些完全明显的东西?
答案 0 :(得分:19)
你的意思是这样吗?
try
{
Push-Location
Set-Location "blah"
# Do some stuff here
}
finally
{
Pop-Location
}
请参阅文档here.特别是该段落:“无论Try块是否遇到终止错误,都会运行Finally块语句.Windows PowerShell在脚本终止之前或当前块之前运行Finally块超出范围。即使您使用CTRL + C来停止脚本,也会运行Finally块。如果Exit关键字在Catch块中停止脚本,则还会运行Finally块。“
答案 1 :(得分:5)
这会处理控制台kepboard输入。如果在循环期间按下控制C,您将有机会根据需要处理事件。在示例代码中,将打印警告并退出循环。
[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
}
}