2010-01-11 18 views
31

से कॉल होने पर बाहर नहीं निकलती है मेरे पास एक पावरशेल स्क्रिप्ट है जो किसी वेब साइट से कनेक्ट होती है, और इसके लौटे डेटा को पार करती है (यह पहले अपलोड की गई SQL फ़ाइल को वेब साइट के डेटा बेस में आयात करने के बारे में है) । PowerShell स्क्रिप्ट wget का उपयोग करता है, जिसे बाद में किसी मूल फ़ंक्शन द्वारा प्रतिस्थापित किया जा सकता है।पावरहेल स्क्रिप्ट फंस जाती है, बैच फ़ाइल

आयात प्रक्रिया एक स्क्रिप्ट में एम्बेडेड है जिसे scriptFTP नामक तृतीय पक्ष प्रोग्राम द्वारा निष्पादित किया जाता है।

स्क्रिप्ट ठीक चलता है जब मैं बहुत की तरह एक भी .bat फ़ाइल से इसे कहते:

powershell "& "C:\data\etc\run_import_script.ps1" 
exit %ERRORLEVEL% 

हालांकि, जब मैं अधिक से अधिक ScriptFTP संदर्भ में से इस .bat फ़ाइल कहते हैं, निम्न होता है:

  • पावरशेल स्क्रिप्ट निष्पादित किया गया है। मैंने यह पुष्टि की कि जब भी रिमोट आयात स्क्रिप्ट को बुलाया जाता है तो मैं खुद को एक ई-मेल भेजता हूं।
  • पावरशेल बाहर निकलने के लिए प्रतीत नहीं होता है, और स्क्रिप्ट निष्पादन अटक गया है। मैं अभी भी Ctrl + C का उपयोग कर पूरी चीज़ को रद्द कर सकता हूं लेकिन निम्न आदेश कभी निष्पादित नहीं होते हैं।

जब मैं निम्नलिखित करने के लिए बैच फ़ाइल बदलने के लिए:

start powershell "& "C:\data\etc\run_import_script.ps1" 
exit %ERRORLEVEL% 

यह काम करता है, एक नया कंसोल में PowerShell स्क्रिप्ट चलाने, लेकिन मैं त्रुटि स्तर है कि PowerShell रिटर्न आकर्षित नहीं कर सकते हैं।

मैंने बैच फ़ाइल को छोड़कर सीधे PowerSTP से PowerShell को कॉल करने का प्रयास किया है, लेकिन उसी परिणाम के साथ: यह बस अटक गया है।

मेरे पास PowerShell स्क्रिप्ट का कोई भी आउटपुट Write-Output या Write-Host प्रदर्शित नहीं होता है।

सभी प्रोग्राम एक ही उपयोगकर्ता के तहत चलते हैं, मुझे।

क्या किसी के पास कोई विचार है कि क्या करना है?

+0

आप डबल कोट्स मेल नहीं खाते हैं - शायद यह एक एसओ स्वरूपण मुद्दा है। बीटीडब्ल्यू अगर आप PowerShell 2.0 पर हैं तो आपको -फाइल उदाहरण का उपयोग करना चाहिए powerhell -file c: \ data \ etc \ run_import_script.ps1 –

+0

@ किथ, तीन उद्धरण जानबूझकर हैं, यहां देखें: http://stackoverflow.com/questions/2035193/how-to-run-a-powershell- स्क्रिप्ट I 1.0 पर हूं लेकिन बदलते विचार पर। चीयर्स। –

+0

इसके बारे में पूर्ण स्रोत कोड के साथ कोई अंतिम समाधान? – Kiquenet

उत्तर

16

/WAIT पैरामीटर जोड़ने का प्रयास करें। Powerbhell स्क्रिप्ट पूर्ण होने तक यह .bat को प्रतीक्षा रखेगा।

START /WAIT powershell "& "C:\data\etc\run_import_script.ps1" 
+2

चीयर्स, यह बहुत अच्छा काम करता है, लेकिन मैं पावरहेल के आउटपुट को उस तरह से कैप्चर नहीं कर सकता - जिसमें त्रुटि होने पर मुझे कंसोल आउटपुट में शामिल करने की आवश्यकता है। –

+0

उस हिस्से के बारे में निश्चित नहीं है जहां पीएस लटक रहा है। पीएस लिपि के अंदर क्या हो रहा है? शायद यह कुछ सूक्ष्म है जो केवल एक स्क्रिप्ट से बुलाया जाता है। अजीब मुझे पता है, लेकिन मैंने इसे पहले देखा है। इसके अलावा, मुझे लगता है कि% ERRORLEVEL% के पास PowerShell.exe के परिणाम होंगे, लेकिन स्क्रिप्ट के परिणाम। इसलिए, जब तक PowerShell.exe पूरा होने तक चलता है, तो यह .ps1 स्क्रिप्ट के अंदर क्या हुआ, इस पर ध्यान दिए बिना 0 वापस आ जाएगा। – aphoria

+0

निष्पादन के दौरान पावरहेल विंडो को कम करने के लिए आप/MIN पैरामीटर भी जोड़ सकते हैं। – Monsignor

0

पावरशेल, कम से कम जो मैं मानता हूं, अजीब व्यवहार इस तरह से बुलाया जाता है। संक्षेप में, यह कमांड लाइन तर्कों को powerhell.exe पर चलाने के लिए स्क्रिप्ट के रूप में पारित नहीं किया जाता है। इसके बजाए, यह उन्हें चलाने के लिए आदेश के रूप में व्यवहार करता है। ऐसा इसलिए है क्योंकि powerhell.exe के लिए डिफ़ॉल्ट -command - powershell.exe/देखें? अतिरिक्त जानकारी के लिए।

C:\>powershell "'Hello'" 
Hello 

आपको बस इतना करना होगा क्या, एक चतुर इनपुट स्ट्रिंग के लिए "स्रोत" स्क्रिप्ट आप चलाना चाहते हैं का निर्माण है:

C:\>powershell ". .\test.ps1" 
Hello, World! 

उत्पादन के लिए के रूप में, एक बार आप स्क्रिप्ट सही ढंग से चलाने के लिए , यह केवल STDOUT को कैप्चर करने या आपकी स्क्रिप्ट के साथ जो भी समाप्त हो रहा है, उसे पकड़ने का विषय होना चाहिए।

पूर्ण उदाहरण

test.bat

@echo off 
powershell.exe ". .\test.ps1" 

test.ps1

"Hello, World!" 

आदेश आह्वान:

test.bat > test.txt 

एक डी आउटपुट को कैप्चर किया गया था:

C:\>type test.txt 
Hello, World! 
+1

चीयर्स गोयिक्स, यह जानना बहुत अच्छा है। अफसोस की बात है, इस तरह व्यवहार भी वही है: निष्पादन बस जम जाता है। मुझे कोई आउटपुट नहीं मिलता है। मैं किसी भी समय पूरी चीज Ctrl + C कर सकता हूं, लेकिन कुछ भी नहीं होगा। यदि मैं दूसरे उत्तर में सुझाए गए 'START/WAIT powerhell.exe' का उपयोग करता हूं, तो यह चलता है, लेकिन मैं आउटपुट को पकड़ नहीं सकता। बहुत अजीब ... –

1

लिया कि अगर वास्तव में क्या आपकी फ़ाइल में है यह है क्योंकि आप बेमेल उद्धरण है है। पावरहेल अंतिम उद्धरण की प्रतीक्षा कर रहा है।

2

यदि आप powerhell.exe आदेशों के आउटपुट को कैप्चर करना चाहते हैं तो आप उसी कमांड शैल में चलाने के लिए प्रक्रिया को मजबूर करने के लिए/B पैरामीटर का भी उपयोग कर सकते हैं।

हमने अभी इस समस्या का एक बहुत ही अजीब उदाहरण देखा है। कॉल powershell.exe -command ... कॉल वाली एक बैच फ़ाइल स्थानीय रूप से ठीक से चलती है लेकिन बैच फ़ाइल को msdeploy -postSync कमांड के संदर्भ में चलाया गया था जब ऊपर वर्णित है। process.Kill() के साथ प्रयोग छोड़ने की PowerShell के लिए मजबूर करने के बाद, हम की START /WAIT /B PowerShell.exe ..

कोई विचार उपयोग क्यों यह काम करना चाहिए पर जलाया, लेकिन यह करता है ...

16

मेरे अनुभव से, PowerShell.exe आसानी से स्क्रिप्ट चला सकते हैं -फाइल स्विच का उपयोग कर एक अनुमानित तरीके से बैच फ़ाइल या खोल स्क्रिप्ट के भीतर। किसी को स्टार्ट कमांड का उपयोग करने की आवश्यकता नहीं है।

महत्वपूर्ण बात करने के लिए एक बैच फ़ाइल के भीतर से

< nul 
कमांड लाइन के लिए

संलग्न करने के लिए है। मेरे शोध से पता चला है कि पावरशेल -फाइल स्विच के माध्यम से संकेतित स्क्रिप्ट में कमांड चलाता है और उसके बाद मानक इनपुट (अतिरिक्त संचार के साथ मेरा संक्षिप्त प्रयोग - इसी तरह के व्यवहार का प्रदर्शन करता है) से अतिरिक्त पावरशेल आदेशों की प्रतीक्षा करता है। मानक इनपुट को नल में रीडायरेक्ट करके, पावरशेल स्क्रिप्ट निष्पादित करने के बाद समाप्त होता है और मानक इनपुट से "एंड-ऑफ-फाइल" पढ़ता है, तो PowerShell निकलता है।

जब Cygwin से PowerShell लागू, इस तरह का उपयोग

< /dev/null 

उदाहरण के लिए, मैं PowerShell स्क्रिप्ट Cygwin से खोल वेरिएबल का उपयोग करके चला लिया है,:

PowerShell.exe -ExecutionPolicy RemoteSigned -File $_powershellscriptpath $_firstscriptparameter < /dev/null 

एक टिप्पणी करता है, तो कृपया पोस्ट आपका अनुभव मेरी ओर से भिन्न है। - गॉर्डन

+5

इसके लिए धन्यवाद, बहुत उपयोगी है। मुझे एक विकल्प मिला जो एक खोल से लॉन्च नहीं होने पर काम करता है (और धाराओं के नियंत्रण में नहीं) इनपुट स्ट्रीम को अक्षम करने के लिए powerhell.exe पर "-InputFormat none" तर्क का उपयोग करना है। – chillitom

0

समस्या यह है कि मैं शर्त लगाता हूं कि पावरहेल प्रक्रिया स्क्रिप्ट को निष्पादित करने के बाद चलाने के लिए निरंतर है। इसका मतलब है कि यह बाहर नहीं हुआ है और इसलिए कोई निकास कोड नहीं है। सी # से पावरशेल स्क्रिप्ट चलाने की कोशिश करते समय मुझे एक ही समस्या आ रही है, जो समाप्त होने पर सामान करता है, सिवाय इसके कि यह कभी खत्म नहीं होता है ...

हैकी, लेकिन मुझे मिला एकमात्र समाधान Stop-Process -processname powershell अंत में रखना है .ps1 स्क्रिप्ट का। यह PowerShell प्रक्रिया को मार देता है (और दुर्भाग्य से आपके द्वारा खोले गए सभी पावरशेल विंडो) लेकिन काम करने लगता है। आपकी स्क्रिप्ट के लिए भी काम कर सकते हैं।

0

मेरे पास सही समस्या थी, हम पावर शैल स्क्रिप्ट को किसी अन्य सिस्टम में एकीकृत करने की कोशिश कर रहे थे और यह टाइमआउट त्रुटि दे रहा था। शायद गॉर्डन स्मिथ द्वारा उल्लिखित मुद्दे के कारण, उनका समाधान काम कर सकता है। लेकिन मेरे लिए मैं स्क्रिप्ट के भीतर से अपनी स्क्रिप्ट का पूर्ण नियंत्रण रखना पसंद करता हूं और जिस तरीके से इसे बुलाया जाता है उस पर निर्भर नहीं है।

$ pid पीआईडी ​​के साथ चर में बनाया गया है। नीचे मौजूदा पावरहेल प्रक्रिया समाप्त हो जाएगी और दूसरों को बरकरार रखा जाएगा। इस तरह कोई भी आपकी स्क्रिप्ट को सामान्य के रूप में कॉल कर सकता है और यह अपेक्षा के अनुसार काम करेगा।

Stop-Process $pid 
0

आप बस .ps1 स्क्रिप्ट (या प्रक्रिया समाप्ति के किसी भी संस्करण है कि आप चाहें तो) के अंत करने के लिए एक 'exit' कमांड जोड़ सकते हैं। पावरहेल स्क्रिप्ट के अंत में चलना जारी रखेगा क्योंकि इसे समाप्त करने के लिए कहा नहीं गया है (जब पीएस या आईएसई में चलाया जाता है तो यह स्क्रिप्ट के अंत में स्वतः समाप्त हो जाएगा लेकिन जब डॉस खोल के माध्यम से नहीं चलाया जाता है)।

9

हमारे पास एक समान समस्या थी। हम सॉफ्टवेयर का एक टुकड़ा है कि बस "कमांड" और "पैरामीटर" प्रवेश करने के लिए एक बॉक्स था, लेकिन हालांकि powershell सफलतापूर्वक चला से एक powershell एप्लिकेशन फोन करना चाहता था (मैं देख सकता प्रभावित फ़ाइल अद्यतन किया गया।)

अंत में मेरी सहकर्मी मुझे यह पता लगा मदद की कमान होने की जरूरत है:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 

और पैरामीटर:

-ExecutionPolicy unrestricted -Command "& {C:\scripts\apps\EDI\Test.ps1; [Environment]::Exit(1)}" 

हमारे मामले में यह Exit 1 के बजाय [Environment]::Exit(1) का उपयोग करना महत्वपूर्ण था। मेरा मानना ​​है कि बाहर निकलें बस स्क्रिप्ट को समाप्त कर रहा था, पावरहेल को बंद नहीं कर रहा था।

+1

इस उत्तर के लिए धन्यवाद। इसने एक समस्या हल की जिसे हमने बांस एजेंट सर्वर और पावरहेल स्क्रिप्ट का उपयोग किया है। – Eddietec

+0

धन्यवाद, ps1 फ़ाइल के अंदर "बाहर निकलने" के बजाय, मेरे लिए भी काम किया। – Pisu

+0

बढ़िया! मैं PS2 के साथ एक सर्वर पर यह मुद्दा होगा, और यह काम किया है। मैंने इसे .ps1 के अंदर जोड़ा है, और '$ lastexitcode' के बजाय, मैं इसे जो कुछ भी चाहता हूं उसे पास कर सकता हूं। धन्यवाद! – curropar

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