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



Answers

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

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

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE
Question

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

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







मैं निम्नलिखित दृष्टिकोण का उपयोग कर काम कर रहा हूं, मेरा समान आदेश प्राप्त करने में सक्षम था:

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

आपके आदेश के लिए (यह नहीं कि यह अब बहुत मदद करता है), चीजें इस तरह कुछ दिखाई देगी:

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

मुख्य बिंदु हैं:

  • स्रोत तर्क के चारों ओर उद्धरण का प्रयोग करें, और कनेक्शन स्ट्रिंग के चारों ओर एम्बेडेड उद्धरण हटा दें
  • SQL कनेक्शन स्ट्रिंग बनाने में वैकल्पिक कुंजी नामों का उपयोग करें जिनमें रिक्त स्थान नहीं हैं। उदाहरण के लिए, "उपयोगकर्ता आईडी" के बजाय "यूआईडी" का उपयोग करें, "डेटा स्रोत" के बजाय "सर्वर", "एकीकृत सुरक्षा" के बजाय "Trusted_Connection" और आगे। कनेक्शन स्ट्रिंग से सभी रिक्त स्थान हटा दिए जाने के बाद ही मैं इसे काम करने में सक्षम था।

मैंने कमांड लाइन के अंत में "computername" भाग जोड़ने का प्रयास नहीं किया, लेकिन उम्मीद है कि यह जानकारी दूसरों को पढ़ने के लिए उनकी वांछित परिणाम के करीब पहुंचने में मदद करेगी।




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



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

PowerShell.exe -Command "& ""C:\Some Script\Path With Spaces.ps1"""

कुंजी यह प्रतीत होती है कि पूरा आदेश बाहरी उद्धरणों में संलग्न है, "&" एम्परसेंड का उपयोग किसी अन्य बाल कमांड फ़ाइल को निष्पादित करने के लिए किया जाता है, फिर आखिर में पथ / फ़ाइल नाम के चारों ओर उद्धरण (दोगुनी-डबल-) उद्धरण आप पहले स्थान पर निष्पादित करना चाहते थे।

यह एमएस कनेक्ट इश्यू के लिए एकमात्र कामकाज का भी पूरा हो रहा है कि -फाइल गैर-शून्य रिटर्न कोड पास नहीं करता है और कॉमांड एकमात्र विकल्प है। लेकिन अब तक यह एक सीमा माना गया था - कमांड यह था कि यह रिक्त स्थान का समर्थन नहीं करता था। मैंने फीडबैक आइटम भी अपडेट किया है।

http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option




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

कॉल ऑपरेटर ( & ), 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




Related