parameters - स्पेस और उद्धरण वाले पैरामीटर के साथ PowerShell में EXE फ़ाइल कैसे चलाएं





quotes spaces (12)


यह मेरे लिए काम किया:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'java', '-jar', 'app.jar')

बस एक सरणी आइटम में पथ या कनेक्शन स्ट्रिंग डालें और अन्य चीजों को एक सरणी आइटम में विभाजित करें।

यहां कई अन्य विकल्प हैं: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

माइक्रोसॉफ्ट को कमांड प्रॉम्प्ट सिंटैक्स के साथ इस तरह से सरल और संगत बनाना चाहिए।

PowerShell में आप निम्न आदेश कैसे चलाते हैं?

सी: \ प्रोग्राम फ़ाइलें \ आईआईएस \ माइक्रोसॉफ्ट वेब तैनात \ msdeploy.exe -verb: सिंक-स्रोत: dbfullsql = "डेटा स्रोत = mysource; एकीकृत सुरक्षा = झूठी; उपयोगकर्ता आईडी = sa; Pwd = sapass!; डेटाबेस = mydb;" -dest: dbfullsql = "डेटा स्रोत =। \ mydestsource; एकीकृत सुरक्षा = झूठी; उपयोगकर्ता आईडी = sa; Pwd = sapass!; डेटाबेस = mydb;", computername = 10.10.10.10, उपयोगकर्ता नाम = व्यवस्थापक, पासवर्ड = adminpass "




अगर कोई सोच रहा है कि निष्पादन योग्य फ़ाइल को कैसे चलाया जाए:

.....>। \ file.exe

या

......> पूर्ण \ path \ to \ file.exe







ऐसा करने के लिए आप कुछ विधियों का उपयोग कर सकते हैं।

कॉल ऑपरेटर ( & ), Invoke-Expression cmdlet आदि का उपयोग करने जैसी अन्य विधियां हैं लेकिन उन्हें असुरक्षित माना जाता है। माइक्रोसॉफ्ट स्टार्ट-प्रोसेस का उपयोग करने की सिफारिश करता है।

विधि 1

एक साधारण उदाहरण

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root","-proot","-h localhost"

आपके मामले में

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync","-source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","-dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","computername=10.10.10.10","username=administrator","password=adminpass"

इस विधि में आप अल्पविराम का उपयोग करते हुए ArgumentList में प्रत्येक पैरामीटर को अलग करते हैं।

विधि 2

सरल उदाहरण

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root -proot -h localhost"

आपके मामले में

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`" -dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`",computername=10.10.10.10,username=administrator,password=adminpass"

यह विधि आसान है क्योंकि यह आपके पैरामीटर को एक बार में टाइप करने की अनुमति देती है।

ध्यान दें कि एक स्ट्रिंग में उद्धरण चिह्न (") का प्रतिनिधित्व करने के लिए पावरहेल में आपको गंभीर उच्चारण (`) डालना चाहिए (यह यूएस कीबोर्ड में टैब कुंजी के ऊपर की कुंजी है)।

-NoNewWindow पैरामीटर वर्तमान कंसोल विंडो में नई प्रक्रिया को प्रदर्शित करने के लिए प्रयोग किया जाता है। डिफ़ॉल्ट रूप से विंडोज पावरशेल एक नई विंडो खुलता है।

संदर्भ: Powershell/Scripting/Start-Process




मेरे पास दोनों कमांड और पैरामीटर में रिक्त स्थान थे, और यह मेरे लिए काम करता है:

$Command = "E:\X64\Xendesktop Setup\XenDesktopServerSetup.exe"
$Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL"

$Prms = $Parms.Split(" ")
& "$Command" $Prms

यह मूल रूप से अकिरा के उत्तर जैसा ही है, लेकिन यह काम करता है यदि आप गतिशील रूप से अपने कमांड पैरामीटर बनाते हैं और उन्हें एक चर में डाल देते हैं।




Base64 एन्कोडेड कमांड स्विच का उपयोग करने का एक वैकल्पिक उत्तर है:

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

डीकोड किए जाने पर, आप देखेंगे कि यह ओपी का मूल स्निपेट है जिसमें सभी तर्क और डबल कोट्स संरक्षित हैं।

powershell.exe -EncodedCommand

Accepts a base-64-encoded string version of a command. Use this parameter
to submit commands to Windows PowerShell that require complex quotation
marks or curly braces.

मूल आदेश:

 C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

बेस 64 के रूप में एन्कोड किए जाने पर यह इसमें बदल जाता है:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

और यहां घर पर दोहराना है:

$command = 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand

#  The clip below copies the base64 string to your clipboard for right click and paste.
$encodedCommand | Clip



नई वी 3 भाषा सुविधाओं से उद्धृत पावरशेल वी 3 में नई एस्केप स्ट्रिंग:

Cmd.exe से कमांड लाइनों का आसान पुन: उपयोग

वेब Cmd.exe के लिए लिखी गई कमांड लाइनों से भरा है। ये कमांड लाइन अक्सर PowerShell में पर्याप्त काम करती हैं, लेकिन जब उनमें कुछ वर्ण शामिल होते हैं, उदाहरण के लिए, अर्धविराम (;), एक डॉलर का चिह्न ($), या घुंघराले ब्रेसिज़, आपको कुछ बदलाव करना पड़ता है, शायद कुछ उद्धरण जोड़ना पड़ता है। यह कई मामूली सिरदर्द का स्रोत प्रतीत होता था।

इस परिदृश्य को हल करने में सहायता के लिए, हमने कमांड लाइनों के पार्सिंग को "से बचने" के लिए एक नया तरीका जोड़ा। यदि आप एक जादू पैरामीटर का उपयोग करते हैं -%, हम आपके कमांड लाइन के सामान्य पार्सिंग को रोकते हैं और कुछ आसान पर स्विच करते हैं। हम उद्धरण से मेल नहीं खाते हैं। हम अर्धविराम पर नहीं रुकते हैं। हम PowerShell चर का विस्तार नहीं करते हैं। यदि आप Cmd.exe वाक्यविन्यास (उदाहरण% TEMP%) का उपयोग करते हैं तो हम पर्यावरण चर का विस्तार करते हैं। इसके अलावा, रेखा के अंत तक तर्क (या पाइप, यदि आप पाइपिंग कर रहे हैं) के रूप में पारित किया जाता है। यहाँ एक उदाहरण है:

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>



जब PowerShell स्ट्रिंग से शुरू होने वाला कमांड देखता है तो यह केवल स्ट्रिंग का मूल्यांकन करता है, यानी, यह आमतौर पर स्क्रीन पर इसे इकोस करता है, उदाहरण के लिए:

PS> "Hello World"
Hello World

यदि आप PowerShell को स्ट्रिंग को कमांड नाम के रूप में समझना चाहते हैं तो कॉल ऑपरेटर (&) का उपयोग इस प्रकार करें:

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

इसके बाद आपको संभवतः केवल पैरामीटर / तर्क जोड़े को उद्धृत करने की आवश्यकता होती है जिनमें रिक्त स्थान और / या उद्धरण वर्ण होते हैं। जब आप जटिल कमांड लाइन तर्कों के साथ इस तरह एक EXE फ़ाइल का आह्वान करते हैं तो यह आमतौर पर एक उपकरण रखने में बहुत मददगार होता है जो आपको दिखाएगा कि PowerShell EXE फ़ाइल में तर्क कैसे भेजता है। पावरशेल समुदाय एक्सटेंशन में ऐसा टूल है। इसे इकोर्ग कहा जाता है। आप EXE फ़ाइल को echoargs से प्रतिस्थापित करते हैं - सभी तर्कों को जगह में छोड़कर, और यह आपको दिखाएगा कि EXE फ़ाइल को तर्क कैसे प्राप्त होंगे, उदाहरण के लिए:

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

इकोर्ग का उपयोग करके आप तब तक प्रयोग कर सकते हैं जब तक कि आप इसे सही न करें, उदाहरण के लिए:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

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

बीटीडब्लू, पावरशेल टीम के लिए हैट्स। वांछित परिणाम प्राप्त करने के लिए वे मुझे सिंगल और डबल कोट्स के विशिष्ट incantation दिखाने में काफी मददगार थे - अगर आपको आंतरिक डबल कोट्स को जगह में रखने की आवश्यकता होती है। :-) वे यह भी महसूस करते हैं कि यह दर्द का एक क्षेत्र है, लेकिन वे किसी विशेष मुद्दे से प्रभावित लोगों की संख्या से प्रेरित होते हैं। यदि यह आपके लिए दर्द का एक क्षेत्र है, तो कृपया इस PowerShell बग सबमिशन को वोट दें।

PowerShell पार्स कैसे करता है, इस बारे में अधिक जानकारी के लिए, मेरी प्रभावी पावरशेल ब्लॉग श्रृंखला देखें - विशेष रूप से आइटम 10 - "पावरशेल पार्सिंग मोड को समझना"

अद्यतन 4/4/2012: PowerShell V3 में इस स्थिति को संभालने में बहुत आसान हो जाता है। विवरण के लिए इस ब्लॉग पोस्ट को देखें




तो, मैं एक समान समस्या में भाग गया और इसके बजाय इसे हल करने का फैसला किया:

  1. बैकटिक (`) वाले अपने उद्धरण (") वर्णों से बचें
  2. उद्धरण के साथ अपनी नई अभिव्यक्ति के आसपास (")
  3. कॉल ऑपरेटर (&) का उपयोग करके, नई स्ट्रिंग पर कमांड invoke-expression आदेश जारी करें

उदाहरण समाधान:

और {invoke-expression "सी: \ प्रोग्राम फ़ाइलें \ IIS \ Microsoft वेब परिनियोजन \ msdeploy.exe -verb: सिंक-स्रोत: dbfullsql =` "डेटा स्रोत = mysource; एकीकृत सुरक्षा = झूठी; उपयोगकर्ता आईडी = sa; Pwd = sapass ! डाटाबेस = mydb; `" -dest: dbfullsql = `" डेटा स्रोत =। \ Mydestsource; एकीकृत सुरक्षा = झूठी; उपयोगकर्ता आईडी = sa; पीडब्ल्यूडी = एसएपीएएस!; डाटाबेस = mydb; `", computername = 10.10.10.10, उपयोगकर्ता नाम = व्यवस्थापक, पासवर्ड = adminpass` ""}




मैंने सभी सुझावों का प्रयास किया लेकिन अभी भी msiexec.exe को उन पैरामीटर के साथ चलाने में असमर्थ था जिनमें रिक्त स्थान थे। तो मेरा समाधान System.Diagnostics.ProcessStartInfo का System.Diagnostics.ProcessStartInfo कर समाप्त हो गया:

# can have spaces here, no problems
$settings = @{
  CONNECTION_STRING = "... ..."
  ENTITY_CONTEXT = "... ..."
  URL = "..."
}

$settingsJoined = ($settings.Keys | % { "$_=""$($settings[$_])""" }) -join " "
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.WorkingDirectory = $ScriptDirectory
$pinfo.FileName = "msiexec.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "/l* install.log /i installer.msi $settingsJoined"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()



.exe नाम से पहले बस ऑपरेटर जोड़ें। चुप्पी मोड में SQL सर्वर एक्सप्रेस स्थापित करने के लिए यहां एक आदेश दिया गया है:

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE



हमें इसी तरह के मुद्दे का सामना करना पड़ा था। हमारा फिक्स नीचे जैसा था,

$path = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe";

$verb = "-verb:sync";

$src = "-source:contentPath=[ESC][ESC][ESC]"c:\aa aa[ESC][ESC][ESC]";

$dest = "-dest:contentPath=[ESC][ESC][ESC]"c:\aa[ESC][ESC][ESC]";

Invoke-Expression "&'$path' $verb $src $dest"; 

जहां, ईएससी - भागने अनुक्रम / चरित्र है







powershell parameters quotes exe spaces