2010-06-11 15 views
5

मैं पावरशेल (v2) स्क्रिप्ट पर एक समय सीमा निर्धारित करना चाहता हूं ताकि उस समय सीमा समाप्त हो जाने के बाद जबरन बाहर निकल जाए।आप PowerShell स्क्रिप्ट के लिए चलाने के लिए समय सीमा कैसे सेट कर सकते हैं?

मैं PHP में देखता हूं उनके पास set_time_limit और max_execution_time जैसे कमांड हैं, जहां आप सीमित कर सकते हैं कि स्क्रिप्ट और यहां तक ​​कि कोई फ़ंक्शन निष्पादित कर सकता है।

मेरी स्क्रिप्ट के साथ, समय पर देख रहे एक डू/जबकि लूप उचित नहीं है क्योंकि मैं बाहरी कोड लाइब्रेरी को कॉल कर रहा हूं जो कि लंबे समय तक लटका सकता है।

मैं कोड के ब्लॉक को सीमित करना चाहता हूं और केवल इसे x सेकंड के लिए चलाने की अनुमति देता हूं, जिसके बाद मैं उस कोड ब्लॉक को समाप्त कर दूंगा और स्क्रिप्ट का समय समाप्त करने वाले उपयोगकर्ता को प्रतिक्रिया वापस कर दूंगा।

मैंने पृष्ठभूमि नौकरियों को देखा है लेकिन वे एक अलग धागे में काम करते हैं इसलिए माता-पिता के धागे पर हत्या अधिकार नहीं होंगे।

क्या किसी ने इसका सामना किया है या कोई समाधान है?

धन्यवाद!

उत्तर

1

मैं जानता हूँ कि यह एक पुरानी पोस्ट है, लेकिन मैं का इस्तेमाल किया है यह मेरी लिपियों में है।

मुझे यकीन नहीं है कि इसका सही उपयोग है, लेकिन System.Timers.Timer कि जॉर्ज ने मुझे एक विचार दिया और ऐसा लगता है कि यह मेरे लिए काम कर रहा है।

मैं इसे उन सर्वरों के लिए उपयोग करता हूं जो कभी-कभी WMI क्वेरी पर लटकते हैं, टाइमआउट इसे अटकने से रोकता है। लेखन-होस्ट के बजाय मैं संदेश को लॉग फ़ाइल में आउटपुट करता हूं ताकि मैं देख सकूं कि कौन से सर्वर टूटा हुआ है और यदि आवश्यक हो तो उन्हें ठीक करें।

मैं भी एक गाइड का उपयोग नहीं करता जो मैं सर्वर होस्टनाम का उपयोग करता हूं।

मुझे उम्मीद है कि यह समझ में आता है और आपकी मदद करता है।

$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

यहां टाइमर का उपयोग करने का एक उदाहरण है। मैं इसे व्यक्तिगत रूप से की कोशिश की है नहीं है, लेकिन मुझे लगता है कि यह काम करना चाहिए:

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

कुछ इस तरह भी काम करना चाहिए ...

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

यह समस्या है कि यह समय समाप्त होने तक प्रतीक्षा करेगा, भले ही कार्यक्रम पहले समाप्त हो गया हो ... – Algoman

संबंधित मुद्दे

 संबंधित मुद्दे