2013-07-25 9 views
6

पर स्क्रिप्ट को समाप्त करें, मेरे पास एक स्क्रिप्ट है जिसमें मैं एक प्रक्रिया को रोकता हूं (मारता हूं)। उसके तुरंत बाद, मुझे यह जांचने के लिए कुछ कोड चाहिए कि प्रक्रिया वास्तव में रुक गई है या नहीं, और यदि नहीं, तो स्क्रिप्ट से बाहर निकलें (और यदि यह वास्तव में रुक गया है, तो स्क्रिप्ट निश्चित रूप से जारी रहेगी।) यहां बताया गया है कि मैंने इसे कैसे करने की कोशिश की:यह सुनिश्चित करने के लिए कि एक दी गई प्रक्रिया नहीं चल रही है, और

if (Get-Process "notepad" -ErrorAction SilentlyContinue) { 
    Write-Host "Program still running somehow, terminating script..." 
    exit 
} 
else 
{ Write-Host "Program stopped." } 

मैंने सोचा कि मैं यह पता लगा कि बयान (Get-Process "progname" -ErrorAction SilentlyContinue) $ सच करने के लिए eval होता था अगर वहाँ एक या अधिक चल रही प्रक्रियाओं (यानी वहाँ उत्पादन लौटे था) था, और $ झूठी अगर कोई उत्पादन वापस आ गया था (मैं निर्दिष्ट यह सुनिश्चित करने के लिए -ErrorAction SilentlyContinue यह सुनिश्चित करने के लिए कि कोई नाम वापस नहीं आएगा जब उस नाम से प्रोग्राम नहीं मिला था।) यह परीक्षण में काम करता था जब मैंने एक रनिंग प्रोग्राम ("नोटपैड") का उपयोग करके इस कोड ब्लॉक को चलाया, और जब मैंने एक गैर- - अनुभवी कार्यक्रम (जैसे "नोटपैडिक्सएक्स" कहें।)

,210

हालांकि, जब मैं तो मेरे बड़े कार्यक्रम में यह एकीकृत है, और लाइन जो कार्यक्रम समाप्त हो जाता है के बाद इसे तुरंत डाल दिया, के रूप में इतना: $ सत्य पर

Write-Host "Terminating Program..." 
Stop-Process -Name "notepad" -Force 
if (Get-Process "notepad" -ErrorAction SilentlyContinue) { 
    Write-Host "Program still running somehow, terminating script..." 
    exit 
} 
else 
{ Write-Host "Program stopped." } 

Get-Process लाइन evals, और स्क्रिप्ट समाप्त होता है। क्या यह Stop-Process लाइन के बीच बस दौड़ की स्थिति है, और बाद में Get-Process लाइन है, या यह एक तर्क दोष है? (और यदि हां, तो ठीक है?)

+0

[पावरहेल: सिंक्रोनस स्टॉप-प्रोसेस] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/4107581/powershell-synchronous-stop-process) – neontapir

+0

यह वही है जो मैं @neontapir चाहता हूं, लेकिन यह सवाल अधिक है परीक्षा के बाद यह सुनिश्चित करता है कि प्रक्रिया जारी रखने से पहले वास्तव में बंद कर दिया गया है। तो, मैं बिल्कुल एक डुप्लिकेट नहीं कहूंगा। हालांकि, मैं संदर्भ की सराहना करता हूं, और इसे शामिल करता हूं; लेकिन, मुझे अभी भी तर्क समस्या मिल रही है :( –

उत्तर

3

अगर हालत के लिए यह प्रयास करें:

if (Get-Process "notepad" -ErrorAction SilentlyContinue | Where-Object {-not $_.HasExited }) 
+0

यह मेरे लिए काम करता प्रतीत होता है ... कार्यक्रम के लिए एक और कई उदाहरणों के साथ परीक्षण किया जाता है (परीक्षण के लिए "नोटपैड"। धन्यवाद! –

0

मुझे लगता है कि समस्या यह है कि आप जाँच कर रहे हैं भी तुरंत बाद है। यदि प्रक्रिया को रोकने का मौका देने से पहले कथन निष्पादित किया गया है। जब आप स्टॉप-प्रोसेस का उपयोग करते हैं, तो यह कमांड को स्टॉप सिग्नल भेजता है और आगे बढ़ता है, यह वास्तव में प्रक्रिया को रोकने की प्रतीक्षा नहीं करता है। और if (Get-Process [...] के बीच Sleep 1, या यहां तक ​​कि Sleep .1 जोड़ने का प्रयास करें। इसे जांचने से पहले इसे समाप्त करने के लिए एक पल दें।

+0

तो मैंने स्टॉप- कमांड लाइन को 'स्टॉप-प्रोसेस -नाम' नोटपैड "-फोर्स -पास-थ्रू | प्रतीक्षा-प्रक्रिया 'के रूप में सुधारकर प्रक्रिया का इंतजार करें, लेकिन जब मैं इसके बाद परीक्षण करता हूं तो' अगर ((प्रक्रिया-प्रक्रिया" नोटपैड "-ररएक्शनएक्शन चुपचाप कंटिन्यू) - एक $ शून्य) {'मैं अभी भी $ सच साबित कर रहा हूं, क्योंकि मुझे ** प्रोग्राम अभी भी चल रहा है, स्क्रिप्ट को समाप्त कर रहा है ... ** आउटपुट के रूप में (और स्क्रिप्ट शब्द 'निकास' को मार रहा है।) –

+0

दिखाई देता है एक दौड़ की स्थिति, वैसे ... अगर मैंने 'स्टॉप-स्लीप-मिलि 300' को 'स्टॉप-प्रोसेस' लाइन और 'if' लाइन' के बीच में रखा है, तो तर्क काम करता है। –

+0

लेकिन यह वही नहीं है जो मैंने सुझाया ** ** प्रतीक्षा-प्रक्रिया ** काम नहीं करेगा क्योंकि ** रोक-प्रक्रिया ** प्रक्रिया को रोकने के निरीक्षण/पर्यवेक्षण नहीं करता है, यह सिर्फ proc को संकेत भेजता है समाप्त करने के लिए निबंध। यह पूरा मुद्दा था कि ** स्टॉप-प्रोसेस ** का आविष्कार पूरी तरह से माना जाता है जब यह प्रक्रिया को निर्देश भेजता है, न कि जब प्रक्रिया वास्तव में रुक जाती है। आदेशों के बीच 'नींद 1' रखें और मुझे लगता है कि आप देखेंगे कि यह काम करता है। –

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