2016-03-09 13 views
11

मेरे पास 6+ स्क्रिप्ट हैं और फ़ोल्डर पर चलाने के लिए बढ़ रही है, उन्हें एक के बाद एक चलाने का सबसे अच्छा तरीका क्या है।एकाधिक पावरहेल स्क्रिप्ट्स को क्रमशः चलाएं - एक फ़ोल्डर पर - स्क्रिप्ट को एक मास्टर स्क्रिप्ट में मिलाएं

मैंने देखा है और इस धागे को आजमाया है - यह दुर्भाग्य से काम नहीं करता है।

How to run multiple Scripts one by one in a powershell script

एक मास्टर .ps फ़ाइल में - मैं शक्ति शेल स्क्रिप्ट आदेश

'C:\Users\WP\Desktop\Scripts\1.ps1' 
'C:\Users\WP\Desktop\Scripts\2.ps1' 
'C:\Users\WP\Desktop\Scripts\3.ps1' 

आदि में

भागो स्क्रिप्ट क्रम में चलाने के लिए जरूरत है कि करने के लिए लिंक डाल दिया है

यह या तो काम नहीं किया। आपकी मदद की सराहना की गई है - मैंने पूरी तरह से खोज की है और इस मुद्दे को ठीक नहीं कर पा रहे हैं।

संशोधित: मेरा मानना ​​है कि मैं प्रत्येक शक्ति खोल स्क्रिप्ट अगले एक को चलाने से पहले समाप्त होने की प्रतीक्षा करना होगा - जब मैं एक के बाद एक 3 लिपियों भागने की कोशिश की के रूप में मैं त्रुटियों पड़ा है - जब स्क्रिप्ट कुछ नहीं हुआ

अंतिम के अनुसार हुआ था -

मैं आप सभी आपकी मदद के लिए धन्यवाद - चीजों को सरल रखने के लिए यह है कि क्या मैं

मेरे फ़ोल्डर किया हो, स्क्रिप्ट है - मैं तो एक मास्टर बनाया है। कोड बी के साथ ps1 इसके अंदर Elow:

&"$PSScriptroot\1.ps1" 
&"$PSScriptroot\2.ps1" 
&"$PSScriptroot\3.ps1" 
&"$PSScriptroot\4.ps1" 
&"$PSScriptroot\5.ps1" 
&"$PSScriptroot\6.ps1" 

मैं तो सभी फ़ाइलों के साथ फ़ोल्डर पर Master.ps1 चलाने - और यह अब तक काम करता है।

+0

जब आप 'दूसरे के बाद एक' कहते हैं, तो क्या आप अगले स्क्रिप्ट को चलाने से पहले प्रत्येक स्क्रिप्ट को पूरा करने के लिए इंतजार करना चाहते हैं, या उन्हें एक ही समय में चलाएं? – Bluecakes

+0

हाय, मुझे प्रत्येक को खत्म करने के लिए इंतजार करना चाहिए - यह समझ में आता है। स्क्रिप्ट 1 चलाएं - फिर 2 फिर 3, अनुक्रमिक रूप से :) – wp44

उत्तर

9

यदि आप पथ को कड़ी मेहनत नहीं करना चाहते हैं, तो आप मास्टर बना सकते हैं।ps1 इस तरह:

&"$PSScriptroot\1.ps1" 
&"$PSScriptroot\2.ps1" 
&"$PSScriptroot\3.ps1" 

और यह वही निर्देशिका में उन स्क्रिप्ट को देखेगा जहां यह है।

+0

क्या '$ PSScriptroot' हमेशा वहां रहा है? मैं 'स्प्लिट-पथ $ MyInvocation.MyCommand.Definition' के साथ स्क्रिप्ट रूट को पार्स कर रहा हूं जो हमेशा के लिए लगता है। – TheMadTechnician

+0

हाय एमजे - मैंने यह किया और "सी: \ उपयोगकर्ता \ WP \ डेस्कटॉप \ Mjolinor \ 1.ps1" और "सी: \ उपयोगकर्ता \ WP \ डेस्कटॉप \ Mjolinor \ 2.ps1" - यह काम किया :) - है वहां कोई मौका है - कि यह खत्म होने के लिए इंतजार कर सकता है - अगली लिपि चलाने से पहले - भविष्य में मामले में - मेरे पास टेक्स्ट फ़ाइलों में स्पेगेटी परिणामों को रोकने के लिए एक लंबी स्क्रिप्ट हो सकती है - धन्यवाद – wp44

+1

वे डिफ़ॉल्ट रूप से अनुक्रमिक रूप से चलेंगे। बहु-धागे को प्राप्त करने के लिए आपको नौकरियों या रनस्पेस का उपयोग करना होगा। – mjolinor

0

क्या आप मास्टर फ़ाइल में फ़ाइलों के पथ को कड़ी मेहनत कर रहे हैं?

इस तरह इस मामले में कुछ

Invoke-Expression "C:\Users\WP\Desktop\Scripts\1.ps1" 
Invoke-Expression "C:\Users\WP\Desktop\Scripts\2.ps1" 
Invoke-Expression "C:\Users\WP\Desktop\Scripts\3.ps1" 
+0

मैं हार्ड कोड नहीं करना चाहूंगा - लेकिन एक पावरहेल नोब के रूप में - मुझे कोई सुराग नहीं है। अगर मैं अन्य सभी स्क्रिप्ट के साथ फ़ोल्डर में master.ps डालता हूं - मैं उन्हें मास्टर से कैसे कहूंगा? धन्यवाद कैप्टन – wp44

1

काम करना चाहिए रास्ता है कि अपनी स्क्रिप्ट आप ऐसा कर सकते में है प्राप्त करने के लिए:

$MyInvocation.MyCommand.Definition 

दैट 'की तरह सी कुछ दिखा देंगे: \ Users \ WP \ डेस्कटॉप \ स्क्रिप्ट \ 'Master.ps1। उस से हम फ़ोल्डर प्राप्त करने के लिए फ़ोल्डर पर Split-Path कर सकते हैं, और फ़ाइलों की सूची प्राप्त करने के लिए फ़ोल्डर पर Get-ChildItem चला सकते हैं।

$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition 
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.FullName -ne $MyInvocation.MyCommand.Definition} 

तो हम सिर्फ एक ForEach-Object लूप के माध्यम से उन चलाते हैं, और आह्वान: हम शायद, गुरु स्क्रिप्ट को बाहर करने के लिए इतना है कि हम एक पुनरावर्ती पाश में अंत नहीं है, इसलिए कि कुछ ऐसा दिखाई देगा चाहता हूँ जैसे कॉल ऑपरेटर & साथ स्क्रिप्ट:

$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition 
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.FullName -ne $MyInvocation.MyCommand.Definition} | ForEach-Object { & $_.FullName } 

संपादित करें: हम्म, यह सही छानने नहीं किया गया। यहां एक पुनः लिखना है जो मास्टर स्क्रिप्ट को सही तरीके से फ़िल्टर करता है।

$Master = Split-Path $MyInvocation.MyCommand.Definition -Leaf 
$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition 
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.Name -ne $Master} | ForEach-Object { & $_.FullName } 
+0

टीएमडी, धन्यवाद - फ़ोल्डर में मैंने 2 स्क्रिप्ट और मास्टर स्क्रिप्ट डाली जो उन्हें बुलाती है ... कुछ हुआ .. लेकिन यह बाद में एक लूप में चला गया। मास्टर में मैंने यह कहा: $ MyInvocation.MyCommand.Definition $ स्क्रिप्टपाथ = स्प्लिट-पथ $ MyInvocation.MyCommand.Definition Get-ChildItem "$ ScriptPath \ *। Ps1" | जहां {$ _। पूर्णनाम- एक $ MyInvocation.MyCommand.Definition} | ForEach-Object {& $ _। FullName} - मुझे यकीन नहीं है कि मैंने सही किया है? – wp44

+0

क्षमा करें, मेरा पहला संस्करण मास्टर स्क्रिप्ट को फ़िल्टर नहीं कर रहा था, इसलिए यह स्क्रिप्ट के हिस्से के रूप में खुद को चला रहा था, और उसने अभी तक एक अंतहीन पाश बनाया था। मैंने अपना जवाब अपडेट किया। – TheMadTechnician

+0

धन्यवाद, मैं इसे अपने पावर खोल उपकरण में जोड़ दूंगा - बॉक्स - :) – wp44

0

क्रमिक रूप से कई लिपियों को चलाने के लिए तुम इतनी तरह Start-Process पर -Wait पैरामीटर का उपयोग कर सकते हैं:

$scriptsList = 
@(
    'C:\Users\WP\Desktop\Scripts\1.ps1' 
    'C:\Users\WP\Desktop\Scripts\2.ps1' 
    'C:\Users\WP\Desktop\Scripts\3.ps1' 
) 

foreach($script in $scriptsList) 
{ 
    Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-command '& $script'" -Wait 
} 

PowerShell वर्तमान स्क्रिप्ट के लिए इंतजार करेंगे अगली बार स्क्रिप्ट

+0

हाय बीसी - मैंने भाग लिया यह बिजली खोल स्क्रीन आया - लेकिन पाठ फ़ाइलों में कोई बदलाव नहीं हुआ - मुझे नहीं पता क्यों :( – wp44

1

कारण है कि powershell चलाने से पहले खत्म करने के लिए स्क्रीन पॉप अप है cuz आप तर्क नहीं है- NoExit सेट। आपका कोड ठीक से चल रहा है तो देखने के लिए निम्नलिखित का उपयोग करें एक उदाहरण के रूप:

Start-Process "$pshome\powershell.exe" -ArgumentList "-NoExit", "-Command '& script'" -wait 

देर प्रतिक्रिया के लिए क्षमा करें, लेकिन मैं भी मुद्दे में भाग गया और thats कैसे मैं बनाने के लिए इसे हल करने में सक्षम था यकीन है कि यह काम था ।

$Scripts = 
@(
".\C:\Scripts\First.ps1" 
".\C:\Scripts\Second.ps1" 
".\C:\Scripts\Third.ps1" 
); 
2

बस एक पाठ फ़ाइल बनाने के किसी भी कोड संपादक या पाठ संपादक का उपयोग, और निम्न उदाहरण बैच स्क्रिप्ट का उपयोग:

start /min powershell.exe C:\your folder\script1.ps1 
start /min powershell.exe C:\your folder\script2.ps1 

सहेजें

इसके अलावा, मैं फ़ाइल नाम इस प्रकार में परिवर्तन इसे script.bat के रूप में खोलें और इसे खोलें। यह एक ही समय में दो शक्तियों की स्क्रिप्ट चलाएगा।

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