2010-01-26 12 views
14

पर एकाधिक पैरामीटर भेजने की शक्तियां मैं पावरहेल स्क्रिप्ट से बाहरी एक्सई चलाने की कोशिश कर रहा हूं।बाहरी कमांड

यह एक्सई 4 पैरामीटर चाहता है।

मैं invoke-item, invoke-command, & 'सी: \ प्रोग्राम फ़ाइलें \ mycmd.exe myparam' के प्रत्येक कॉम्बो की कोशिश कर रहा हूं, पथ में रिक्त स्थान से छुटकारा पाने के लिए C: \ में शॉर्टकट बनाया है।

मैं इसे एक पैरामीटर के साथ काम कर सकता हूं, लेकिन अधिक नहीं। मुझे विभिन्न त्रुटियां मिलती हैं I

समेकित करने के लिए, आप एक एक्सई में 4 पैरामीटर कैसे भेजते हैं?

उत्तर

20

यदि यह लंबे समय में दिखाया गया है तो यह सबसे अच्छा है। एक बार जब आप देखते हैं कि क्या हो रहा है, तो आप प्रत्येक तर्क के बीच अल्पविरामों का उपयोग करके इसे कम कर सकते हैं।

$arg1 = "filename1" 
$arg2 = "-someswitch" 
$arg3 = "C:\documents and settings\user\desktop\some other file.txt" 
$arg4 = "-yetanotherswitch" 

$allArgs = @($arg1, $arg2, $arg3, $arg4) 

& "C:\Program Files\someapp\somecmd.exe" $allArgs 

... आशुलिपि:

PS> ipconfig /allcompartments /all 

आप कर सकते हैं:

& "C:\Program Files\someapp\somecmd.exe" "filename1", "-someswitch", "C:\documents and settings\user\desktop\some other file.txt", "-yetanotherswitch" 
+3

'&' सी: \ प्रोग्राम फ़ाइलों \ someapp \ somecmd.exe "-र्ग $ allArgs' के साथ देखें - '-र्ग' अनावश्यक है जब तक कि आप कुछ -mmd के पैरामीटर के रूप में' -arg' को पास करने का इरादा नहीं रखते ।प्रोग्राम फ़ाइल। –

+0

हाँ, किसी भी कारण से मैंने आज इसका उल्लेख किया, और ध्यान दिया कि इसमें सेग के साथ कोड की रेखा भी काम नहीं करती है! उफ़/हटा दिया। –

12

आसान मामले में, एक देशी exe करने के लिए तर्क गुजर निर्मित एक आदेश का उपयोग कर के रूप में सरल है जब आप EXE के लिए पूर्ण पथ निर्दिष्ट करते हैं तो समस्याएं चलाएं और उस पथ में रिक्त स्थान हैं। उदाहरण के लिए यदि PowerShell यह दिखाई देगा:

PS> C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe -k .\pubpriv.snk 

यह आदेश की व्याख्या "C: \ Program" और "Files \ Microsoft" पहले पैरामीटर, "SDKs \ Windows \ v7.0 \ बिन \ एस.एन. के रूप में।

PS> & 'C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe' -k .\pubpriv.snk 

अगले क्षेत्र हम साथ समस्याओं में चलाने: exe "दूसरा पैरामीटर, आदि के रूप में सरल समाधान एक स्ट्रिंग में पथ डाल करने के लिए मंगलाचरण ऑपरेटर & का उपयोग कमांड पथ जैसे द्वारा नाम आह्वान करने के लिए है जब तर्क जटिल होते हैं और/या वर्णों का उपयोग करते हैं जो PowerShell विशेष रूप से व्याख्या करता है उदाहरण:

PS> sqlcmd -v user="John Doe" -Q "select '$(user)' as UserName" 

यह काम नहीं करता है और हम PowerShell Community Extensions से echoargs.exe नामक टूल का उपयोग करके इसे डीबग कर सकते हैं जो आपको दिखाता है कि देशी EXE को PowerShell से तर्क कैसे प्राप्त होते हैं।

PS> echoargs -v user="John Doe" -Q "select '$(user)' as UserName" 
The term 'user' is not recognized as the name of a cmdlet, function, 
script file, or operable program. Check the spelling of the name, ... 
<snip> 

Arg 0 is <-v> 
Arg 1 is <user=John Doe> 
Arg 2 is <-Q> 
Arg 3 is <select '' as UserName> 

ध्यान दें कि Arg3 $(user) साथ & व्याख्या की है एक खाली स्ट्रिंग में PowerShell और परिणाम द्वारा मूल्यांकन। आप इस समस्या को और डबल qoutes के बजाय एकल उद्धरण का उपयोग करके इसी तरह के मुद्दों की एक अच्छी संख्या में ठीक कर सकते हैं जब तक आप वास्तव में एक चर जैसे मूल्यांकन करने के लिए PowerShell की जरूरत है:

PS> echoargs -v user="John Doe" -Q 'select "$(user)" as UserName' 
Arg 0 is <-v> 
Arg 1 is <user=John Doe> 
Arg 2 is <-Q> 
Arg 3 is <select $(user) as UserName> 

यदि सब विफल रहता है, यहां स्ट्रिंग और आरंभ का उपयोग इसलिए जैसे प्रक्रिया:

PS> Start-Process echoargs -Arg @' 
>> -v user="John Doe" -Q "select '$(user)' as UserName" 
>> '@ -Wait -NoNewWindow 
>> 
Arg 0 is <-v> 
Arg 1 is <user=John Doe> 
Arg 2 is <-Q> 
Arg 3 is <select '$(user)' as UserName> 

नोट आप आप PSCX 1.2 उपयोग कर रहे हैं तो तरह शुरू-प्रक्रिया उपसर्ग करने की आवश्यकता होगी - PowerShell के अंतर्निहित प्रारंभ प्रक्रिया cmdlet का उपयोग करने Microsoft.PowerShell.Management\Start-Process

+0

एचएम; यह देखकर मुझे फिर से आश्चर्य होता है: क्या PowerShell v2 में cmdlets के पीएससीएक्स संस्करणों को रखने का कोई अच्छा कारण है? गेट-रैंडम ने इसे पूरी तरह से अलग अर्थशास्त्र के कारण कुछ बार छोड़ दिया। – Joey

+0

कोई नहीं है। इसलिए हमने तीन सेमीडलेट्स को स्थानांतरित कर दिया है जिनके नाम पीएससीएक्स 2.0 (Pscx.Deprecated.psd1) में एक अलग मॉड्यूल में टकराव हैं। डाउनलोड के लिए 2.0 बीटा उपलब्ध है लेकिन क्योंकि यह मॉड्यूल आधारित है, यह केवल PowerShell 2.0 पर काम करता है। –

+2

मैंने अभी यह देखा है: [पावरशेल और बाहरी आदेश सही किए गए हैं] (http://edgylogic.com/blog/powershell-and-external-commands-done-right/)। लगभग समान सलाह। –

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