2010-06-11 35 views
5

Tôi muốn đặt giới hạn thời gian cho tập lệnh PowerShell (v2) để nó thoát ra sau khi hết hạn thời gian đó.Làm cách nào để bạn có thể đặt giới hạn thời gian cho tập lệnh PowerShell để chạy?

Tôi thấy trong PHP, chúng có các lệnh như set_time_limit và max_execution_time nơi bạn có thể giới hạn khoảng thời gian tập lệnh và thậm chí một hàm có thể thực thi.

Với tập lệnh của tôi, vòng lặp do/while đang xem thời gian không phù hợp vì tôi đang gọi thư viện mã bên ngoài có thể treo trong một thời gian dài.

Tôi muốn giới hạn một khối mã và chỉ cho phép mã chạy trong x giây, sau đó tôi sẽ chấm dứt khối mã đó và trả về phản hồi cho người dùng rằng tập lệnh đã hết thời gian chờ.

Tôi đã xem xét các công việc nền nhưng chúng hoạt động trong một chuỗi khác nhau do đó sẽ không có quyền giết trên chuỗi gốc.

Có ai đã giải quyết vấn đề này hoặc có giải pháp không?

Cảm ơn!

Trả lời

1

Tôi biết đây là một bài cũ, nhưng tôi đã sử dụng điều này trong kịch bản của tôi.

Tôi không chắc liệu nó có sử dụng đúng hay không, nhưng System.Timers.Timer mà George đã đưa ra cho tôi một ý tưởng và dường như nó có tác dụng với tôi.

Tôi sử dụng nó cho các máy chủ đôi khi treo trên một truy vấn WMI, thời gian chờ dừng nó gặp khó khăn. Thay vì máy chủ lưu trữ, tôi sau đó xuất thông điệp vào tệp nhật ký để tôi có thể xem máy chủ nào bị hỏng và sửa chúng nếu cần.

Tôi cũng không sử dụng guid tôi sử dụng tên máy chủ của máy chủ.

Tôi hy vọng điều này có ý nghĩa và giúp bạn.

$MyScript = { 
       Get-WmiObject -ComputerName MyComputer -Class win32_operatingsystem 
      } 

$JobGUID = [system.Guid]::NewGuid() 

$elapsedEventHandler = { 
    param ([System.Object]$sender, [System.Timers.ElapsedEventArgs]$e) 

    ($sender -as [System.Timers.Timer]).Stop() 
    Unregister-Event -SourceIdentifier $JobGUID 
    Write-Host "Job $JobGUID removed by force as it exceeded timeout!" 
    Get-Job -Name $JobGUID | Remove-Job -Force 
} 

$timer = New-Object System.Timers.Timer -ArgumentList 3000 #just change the timeout here 
Register-ObjectEvent -InputObject $timer -EventName Elapsed -Action $elapsedEventHandler -SourceIdentifier $JobGUID 
$timer.Start() 

Start-Job -ScriptBlock $MyScript -Name $JobGUID 
1

Dưới đây là ví dụ về sử dụng Bộ hẹn giờ. Tôi đã không thử nó cá nhân, nhưng tôi nghĩ rằng nó sẽ làm việc:

function Main 
{ 
    # do main logic here 
} 

function Stop-Script 
{ 
    Write-Host "Called Stop-Script." 
    [System.Management.Automation.Runspaces.Runspace]::DefaultRunspace.CloseAsync() 
} 

$elapsedEventHandler = { 
    param ([System.Object]$sender, [System.Timers.ElapsedEventArgs]$e) 

    Write-Host "Event handler invoked." 
    ($sender -as [System.Timers.Timer]).Stop() 
    Unregister-Event -SourceIdentifier Timer.Elapsed 
    Stop-Script 
} 

$timer = New-Object System.Timers.Timer -ArgumentList 2000 # setup the timer to fire the elapsed event after 2 seconds 
Register-ObjectEvent -InputObject $timer -EventName Elapsed -SourceIdentifier Timer.Elapsed -Action $elapsedEventHandler 
$timer.Start() 

Main 
3

Something như thế này nên làm việc quá ...

$job = Start-Job -Name "Job1" -ScriptBlock {Do {"Something"} Until ($False)} 
Start-Sleep -s 10 
Stop-Job $job 
+0

Điều này có vấn đề là nó sẽ đợi cho đến khi hết thời gian, ngay cả khi chương trình đã chấm dứt trước đó ... – Algoman

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