2008-09-08 17 views
5

में बैच नौकरियां बनाना एक डॉस शैली की कल्पना करें .cmd फ़ाइल जिसका उपयोग सही क्रम में परस्पर निर्भर विंडो वाले अनुप्रयोगों को लॉन्च करने के लिए किया जाता है।PowerShell

उदाहरण:
1) पैरामीटर के साथ एक exe कॉल करके एक सर्वर अनुप्रयोग लॉन्च करें।
2) सर्वर को आरंभ करने के लिए प्रतीक्षा करें (या निश्चित समय)।
3) पैरामीटर के साथ एक exe कॉल करके ग्राहक अनुप्रयोग लॉन्च करें।

PowerShell में इस तरह के बैच नौकरी को पूरा करने का सबसे आसान तरीका क्या है?

उत्तर

5

याद रखें कि PowerShell .NET ऑब्जेक्ट्स तक पहुंच सकते हैं। Blair Conrad द्वारा सुझाए गए स्टार्ट-स्लीप को सर्वर प्रक्रिया के WaitForInputIdle पर कॉल करके प्रतिस्थापित किया जा सकता है ताकि आप क्लाइंट प्रारंभ करने से पहले सर्वर तैयार हो जाएं।

$sp = get-process server-application 
$sp.WaitForInputIdle() 

तुम भी Process.Start का उपयोग की प्रक्रिया शुरू करने और इसे सही प्रक्रिया वापसी हो सकती है। तब आपको प्रक्रिया-प्रक्रिया की आवश्यकता नहीं है।

$sp = [diagnostics.process]::start("server-application", "params") 
$sp.WaitForInputIdle() 
$cp = [diagnostics.process]::start("client-application", "params") 
0

अनुप्रयोगों की शुरूआत के बीच 10 सेकंड प्रतीक्षा करने के लिए, कोशिश

launch-server-application serverparam1 serverparam2 ... 
Start-Sleep -s 10 
launch-client-application clientparam1 clientparam2 clientparam3 ... 

आप एक स्क्रिप्ट बनाना चाहते हैं और तर्क में पारित कर दिया है, तो एक फ़ाइल बुलाया runlinkedapps.ps1 इन सामग्री के साथ बना सकते हैं (या जो भी):

launch-server-application $args[0] $args[1] 
Start-Sleep -s 10 
launch-client-application $args[2] $args[3] $args[4] 

या फिर आप उस लाइन पर सर्वर और क्लाइंट पैरामीटर वितरित करना चुनते हैं जिसका उपयोग आप runlinkedapps.ps1 को चलाने के लिए करते हैं। यदि आप चाहते हैं, तो आप 10 हार्डकोडिंग के बजाय, देरी में भी पास कर सकते हैं।

याद रखें, आपकी .ps1 फ़ाइल को आपके पथ पर होना आवश्यक है, या जब आप इसे चलाते हैं तो आपको अपना स्थान निर्दिष्ट करना होगा। (ओह, और मैंने माना है कि लॉन्च-सर्वर-एप्लिकेशन और लॉन्च-क्लाइंट-एप्लिकेशन आपके पथ पर हैं - यदि नहीं, तो आपको उन्हें पूरा पथ भी निर्दिष्ट करना होगा।)

1

@Lars Truijens सुझाव

याद रखें कि PowerShell नेट वस्तुओं का उपयोग कर सकते हैं। ब्लेयर कॉनराड द्वारा सुझाए गए के रूप में स्टार्ट-स्लीप सर्वर प्रक्रिया के WaitForInputIdle पर कॉल द्वारा प्रतिस्थापित किया जा सकता है ताकि आपको पता चल सके कि क्लाइंट क्लाइंट शुरू करने से पहले सर्वर तैयार है।

यह निश्चित समय (या पैरामीटर के माध्यम से आपूर्ति) के लिए सोने की तुलना में अधिक सुरुचिपूर्ण है। हालांकि, WaitForInputIdle

एक यूजर इंटरफेस के साथ ही प्रक्रियाओं पर लागू होता है और इसलिए, संदेश पाश।

इसलिए यह लॉन्च-सर्वर-एप्लिकेशन की विशेषताओं के आधार पर काम नहीं कर सकता है।हालांकि, जैसा कि लार्स ने मुझे बताया, को एप्लिकेशन (जिसे मैंने प्रश्न पढ़ते समय याद किया) को संदर्भित किया गया, इसलिए उसका समाधान शायद सबसे अच्छा है।

+0

हाँ, आप सही हैं। हालांकि, सवाल बताए गए खिड़कियों के अनुप्रयोगों में मैंने माना कि यह मामला है। –

+0

उत्कृष्ट बिंदु, लार्स। मैंने इसे "विंडोज" के रूप में पढ़ा। उफ़। फिर भी, यह किसी के लिए उपयोगी जानकारी हो सकती है, कभी-कभी ... –

+0

यदि आप लॉन्च कर रहे हैं एक कमांड लाइन प्रक्रिया है तो आप $ sp.WaitForExit() का उपयोग कर सकते हैं –