पॉवरशेल - स्टार्ट-प्रोसेस और सीमलाइन स्विच


79

मैं यह जुर्माना चला सकता हूं:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
start-process $msbuild -wait

लेकिन जब मैं इस कोड को चलाता हूं (नीचे) मुझे एक त्रुटि मिलती है:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo" 
start-process $msbuild -wait

क्या कोई तरीका है जिससे मैं स्टार्ट-प्रोसेस का उपयोग करके MSBuild को पैरामीटर पास कर सकता हूं? मैं स्टार्ट-प्रोसेस का उपयोग नहीं करने के लिए तैयार हूं, केवल एक ही कारण जिसका मैंने उपयोग किया था मुझे एक चर के रूप में "कमांड" की आवश्यकता थी।

जब मेरे पास
C: \ WINDOWS \ Microsoft.NET \ फ्रेमवर्क \ v3.5 \ MSBuild.exe / v: q / nologo
एक लाइन पर अपने आप होता है, तो Powershell में कैसे संभाला जाता है?

क्या मुझे इसके बजाय किसी प्रकार के eval () प्रकार के फ़ंक्शन का उपयोग करना चाहिए?


प्रारंभ-प्रक्रिया के विकल्पों के लिए ब्लॉगs.msdn.com/powershell/archive/2007/01/16/… देखें ।
इ_म_जॉर्फ़

धन्यवाद jeffamaphone, यह कुछ अच्छी संदर्भ जानकारी भी थी।

1
ध्यान रखें कि स्टार्ट-प्रोसेस V2 में एक नई सुविधा है। उस पोस्ट की जानकारी बहुत अच्छी है, लेकिन इसमें से कुछ वास्तव में V2 में आवश्यक नहीं हैं।
ईबीग्रीन

स्टार्ट-प्रोसेस स्वयं V2 के लिए नया है? क्या आप थोड़ा विस्तार कर सकते हैं? मैं परीक्षण के लिए स्थापित V1 के साथ कोई मशीन नहीं है।

1
मेरा सिर्फ इतना मतलब है कि स्टार्ट-प्रोसेस कमांडलेट V1 में मौजूद नहीं था। V1 में आपको Jef से जुड़े ब्लॉग पोस्ट में सूचीबद्ध तरीकों में से एक का उपयोग करना था।
ईबीग्रीन

जवाबों:


124

आप अपने तर्क अलग पैरामीटर में अलग करना चाहते हैं

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments 

15
$argsएक चर नाम काम नहीं करता है, यह आरक्षित है। $argumentsइसके बजाय या कुछ और का उपयोग करें
joshcomley

1
ऐसा लगता है कि सुझाव कतार पूर्ण है, लेकिन मैं पाठकों को यह समझने की सलाह -ArgumentListदूंगा कि स्ट्रिंग की तलाश है, इसलिए कॉमा से अलग किए गए तार के साथ दूसरे उत्तर पर उदाहरण (तकनीकी रूप से एक सरणी) काम कर सकता है क्योंकि PowerShell संभावित रूप से इसे कैसे अनियंत्रित करता है, लेकिन आप हैं एक सरणी से एक तर्क सूची में पास होने की तलाश में यह शायद पहले से ही एक स्ट्रिंग में "अनपैक" करना सबसे अच्छा है।
ड्रैगन।।

3
@ ड्रैगन 788, get-help start-processइंगित करता है कि -आर्गुमेंटलिस्ट उम्मीद करता हैString[]
asynchronos

60

स्पष्ट मापदंडों का उपयोग करना, यह होगा:

$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe'
start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'

संपादित करें: उद्धरण।


मुझे लगता है कि यह उनके बिना ठीक होगा, लेकिन यह निश्चित रूप से उनके साथ ठीक होगा, इसलिए मैं इसे संपादित
करूंगा

4
यह उपयोग करने के लिए अधिक विश्वसनीय लगता है-ArgumentList ('/v:q','/nologo')
पीटर टेलर

1
Powershell SO वर्बोज़ है। git gui &कितना सरल है कि (* निक्स बेशक)! की तुलना में start-Process git -ArgumentList gui। मैं जानता हूं कि मैं जानता हूं, मददगार नहीं। मैं थोड़ी देर के लिए पॉवर्सशेल के साथ खेल रहा हूं और बहुत सारी अच्छी चीजें; लेकिन वाचालता एक हत्यारा है!
हांकाका

1
ठीक है, यह केवल वह क्रिया है यदि आप इसे चाहते हैं: git -args gui काम भी शुरू करें । मुझे एहसास है कि यह अभी भी * निक्स से अधिक क्रिया है। मुद्दा यह है कि यदि आप टैब पूरा करने और उपनाम का उपयोग करते हैं, तो वास्तविक कीस्ट्रोक्स की संख्या काफी कम हो जाती है। मैं यह भी जोड़ूंगा कि क्रियाशीलता का अर्थ है कि एक व्यक्ति जो शक्तियों को अच्छी तरह से नहीं जानता है वह पीएस कमांड को पढ़ सकता है और अधिक आसानी से ठीक से समझ सकता है कि यह क्या कर रहा है। दर्शन में बस एक अंतर है।
ईबीग्रीन

@ हक्का,sajb { git gui }
अतुल्यकालिक

7

चेतावनी

यदि आप Powershell द्वारा बनाई गई cmd.exe विंडो से PowerShell चलाते हैं, तो दूसरा उदाहरण नौकरियों के पूरा होने का इंतजार नहीं करता है।

cmd>  PowerShell
PS> Start-Process cmd.exe -Wait 

अब नई cmd विंडो से, PowerShell को फिर से चलाएँ और इसके भीतर एक 2nd cmd विंडो शुरू करें: cmd2> PowerShell

PS> Start-Process cmd.exe -Wait
PS>   

PowerShell का दूसरा उदाहरण अब -Wit अनुरोध और सभी पृष्ठभूमि प्रक्रिया / कार्य 'पूर्ण' स्थिति लौटाता है, भले ही वे अभी भी चल रहे हों!

मुझे यह पता चला जब मेरे C # एक्सप्लोरर प्रोग्राम का उपयोग cmd.exe विंडो खोलने के लिए किया जाता है और PS को उस विंडो से चलाया जाता है, यह -Wait अनुरोध को भी अनदेखा करता है। ऐसा प्रतीत होता है कि कोई भी PowerShell जो cmd.exe की 'win32 जॉब' है, प्रतीक्षा अनुरोध को सम्मानित करने में विफल रहती है।

मैं विंडोज 7 / x64 पर PowerShell संस्करण 3.0 के साथ इसमें भाग गया


5

मैंने पाया है कि cmd एक विकल्प के रूप में अच्छी तरह से काम करता है, खासकर जब आपको कॉल किए गए एप्लिकेशन से आउटपुट को पाइप करने की आवश्यकता होती है (स्पष्ट रूप से जब यह लॉगिंग में निर्मित नहीं होता है, तो msbuild के विपरीत)

cmd /C "$msbuild $args" >> $outputfile


2

जब तक ओपी पॉवरशेल सामुदायिक एक्सटेंशन का उपयोग कर रहा है जो दूसरों के एक समूह के साथ एक स्टार्ट-प्रोसेस cmdlet प्रदान करता है। यदि यह मामला है, तो ग्लेनुलर का समाधान एक इलाज का काम करता है क्योंकि यह pscx \ start-process: -path (स्थिति 1) -arguments (पॉज़िटॉन 2) के स्थितीय मापदंडों से मेल खाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.