2012-04-16 53 views
9

這可能嗎?我終於決定開始建立我的個人.NET開發環境,以更接近地模仿我將如何建立* NIX開發環境,這意味着認真學習Powershell。如何在PowerShell中捕獲信號?

我目前正在編寫一個函數,通過文件系統遞歸,設置工作目錄,因爲它爲了構建的東西。讓我困擾的一件事是,如果我按Ctrl + C退出該功能,則無論腳本最後一次出現在哪裏,都會使我無法工作。我試過設置一個trap塊,它在運行時將目錄更改爲起始點,但這似乎只是針對Exception而設置(並觸發)。

如果這是在Unix中有根的語言,我會爲SIGINT設置一個信號處理程序,但在Powershell中找不到類似的搜索。放在我的.NET上限上,我想象着某種事件,我可以附加一個處理程序,如果我不得不猜測,這將是一個事件$host,但我找不到任何規範文檔System.Management.Automation.Internal.Host.InternalHostUserInterface,沒有什麼軼事,我已經能夠搜索有幫助。

也許我錯過了一些完全明顯的東西?

回答

16

你的意思是這樣的嗎?

try 
{ 
    Push-Location 
    Set-Location "blah" 
    # Do some stuff here 
} 

finally 
{ 
    Pop-Location 
} 

查看文檔here.特別是那款:「finally塊無論try塊是否遇到終止錯誤語句運行Windows PowerShell運行finally塊中的腳本終止之前或之前,在當前塊超出範圍內,即使使用CTRL + C停止腳本,也會運行Finally塊。如果Exit關鍵字停止Catch塊內的腳本,則最後一個塊也會運行。

+2

最後一個直接的解決方案來清理CTRL-C終止工作(: – Callahan 2013-08-19 12:50:48

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

不從ISE工作,但完美在一個正常的PowerShell窗口 – Froosh 2014-04-29 02:53:55