2012-04-16 32 views
9

Điều này có khả thi không? Cuối cùng tôi đã quyết định bắt đầu thiết lập môi trường phát triển .NET cá nhân của mình để bắt chước cách tôi thiết lập một môi trường dev * NIX, có nghĩa là học Powershell một cách nghiêm túc.Làm cách nào để bẫy tín hiệu trong PowerShell?

Tôi hiện đang viết một hàm đệ quy thông qua hệ thống tệp, thiết lập thư mục hoạt động khi nó hoạt động để xây dựng mọi thứ. Một điều nhỏ làm tôi bực mình là nếu tôi Ctrl + C ra khỏi chức năng, nó để lại cho tôi bất cứ nơi nào kịch bản cuối cùng là. Tôi đã cố gắng thiết lập một khối trap mà thay đổi thư mục đến điểm khởi đầu khi chạy, nhưng điều này dường như chỉ được dự định (và cháy) về ngoại lệ.

Nếu ngôn ngữ này có ngôn ngữ gốc trong Unix, tôi đã thiết lập trình xử lý tín hiệu cho SIGINT, nhưng tôi không thể tìm thấy bất kỳ nội dung nào tương tự tìm kiếm trong Powershell. Đặt trên nắp .NET của tôi, tôi đang tưởng tượng có một số loại sự kiện mà tôi có thể đính kèm một trình xử lý, và nếu tôi phải đoán, nó sẽ là một sự kiện của $host, nhưng tôi không thể tìm thấy bất kỳ tài liệu chuẩn nào cho System.Management.Automation.Internal.Host.InternalHostUserInterface và không có giai thoại nào mà tôi có thể tìm kiếm đã hữu ích.

Có lẽ tôi đang thiếu điều gì đó hoàn toàn hiển nhiên?

Trả lời

16

Bạn có ý nghĩa như thế này không?

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

finally 
{ 
    Pop-Location 
} 

Xem tài liệu here. Riêng rằng đoạn:. "Các Cuối cùng chặn tuyên bố chạy bất kể khối Try gặp một lỗi chấm dứt Windows PowerShell chạy Cuối cùng chặn trước khi kịch bản chấm dứt hoặc trước khối hiện tại đi ra khỏi Một khối Cuối cùng chạy ngay cả khi bạn sử dụng CTRL + C để dừng tập lệnh.Một khối Cuối cùng cũng chạy nếu một từ khóa Thoát dừng tập lệnh từ bên trong khối Catch. "

+2

Cuối cùng, một giải pháp thẳng về phía trước để xóa CTRL-C chấm dứt công việc (: – Callahan

5

Điều này xử lý đầu vào bàn điều khiển kepboard. Nếu điều khiển C được nhấn trong vòng lặp, bạn sẽ có cơ hội xử lý sự kiện theo ý muốn. Trong mã ví dụ, một cảnh báo được in và vòng lặp được thoát.

[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

Không hoạt động từ ISE, nhưng hoàn hảo trong cửa sổ PowerShell bình thường – Froosh

Các vấn đề liên quan