PowerShell में EXE फ़ाइल को चलाने के लिए कैसे रिक्त स्थान और उद्धरण के साथ मापदंडों के साथ


332

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

C: \ Program Files \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: सिंक -source: dbfullsql = "डेटा स्रोत = mysource; एकीकृत सुरक्षा = गलत; उपयोगकर्ता आईडी = sa; Pwd = स्वैप = डेटाबेस = mydb;" -dest: dbfullsql = "डेटा स्रोत =। mydestsource; एकीकृत सुरक्षा = गलत; उपयोगकर्ता ID = sa; Pwd = sapass! डेटाबेस = mydb?", कम्प्यूटरीकरण = 10.10.1.10, उपयोगकर्ता नाम = व्यवस्थापक, पासवर्ड = व्यवस्थापक "



यदि आप "पॉवरशेल में लिटिरल" का अर्थ है (जो कि मैं "मौजूदा पॉवरशेल प्रॉम्प्ट के अंदर" का अर्थ समझाता हूं), तो निम्न उदाहरण आसानी से आपकी आवश्यकताओं के अनुरूप हो सकते हैं। ध्यान दें कि कमांड को इसके मापदंडों से अलग करने की कोई आवश्यकता नहीं है: # Show any available updates to globally installed npm packages using the npm-check-updates tool [string] $cmd = 'ncu -g' Write-Verbose -Message $cmd Invoke-Command -ScriptBlock ([ScriptBlock]::Create($cmd))
user3785010।

मुझे नहीं पता कि कोड की प्रत्येक पंक्ति को एक अलग लाइन पर दिखाने के लिए उपरोक्त टिप्पणी को संपादित करने के लिए "मिनी-मार्कडाउन" का उपयोग कैसे करना है और मूल टिप्पणी को संपादित करने की 5 मिनट की समय सीमा समाप्त हो गई है। यदि किसी को अब समस्या को ठीक करने के लिए "मिनी-मार्कडाउन" का उपयोग करने का पता है, तो मैं एक और अधिक पठनीय रूप में पुनर्प्राप्त करूंगा। पहली पंक्ति सिर्फ निम्नलिखित होनी चाहिए: # विश्व स्तर पर स्थापित एनपीएम पैकेजों के लिए npm-check-updates टूल का उपयोग करके कोई भी उपलब्ध अपडेट दिखाएं
user3785010

जवाबों:


346

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

PS> "Hello World"
Hello World

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

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

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

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

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

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


1
यदि दूसरे उदाहरण के रूप में उपयोग किया जाता है, तो मुझे यह त्रुटि मिलती है: त्रुटि: अपरिचित तर्क '' -source: dbfullsql = "" "डेटा '। सभी तर्क "-" से शुरू होने चाहिए।
वैन

2
मुझे क्षमा करें, मुझे समझ नहीं आया। मैं देख रहा हूं कि, वर्तमान में, 6 लोगों ने उत्तर को उलट दिया है इसलिए मुझे कुछ स्पष्ट याद आ रहा है, लेकिन वास्तविक उत्तर क्या है? क्या पॉवरशेल के साथ रिक्त स्थान वाले मापदंडों के बारे में जानने के लिए एक विशेष नियम है, या आप बस इसे मामला-दर-मामला लेने का सुझाव दे रहे हैं, मदद करने के लिए इकोआर्ग का उपयोग कर रहे हैं?
टायलर कोलियर

तर्कों का उद्धरण देना आमतौर पर पर्याप्त होता है लेकिन हमेशा नहीं। उन मामलों में जहां यह काम नहीं करता है, का उपयोग इस बात echoargsका संकेत देता है कि पावरशेल तर्कों की व्याख्या कैसे कर रहा है इससे पहले कि यह उन्हें EXE पर पारित करता है।
कीथ हिल

1
क्या आप जानते हैं कि मैं एक .bat फ़ाइल में यह कैसे करूँगा? मैं & 'C:\Program Files\Sublime Text 3\sublime_text.exe'सीधे कंसोल में कोशिश कर रहा हूं और यह काम कर रहा है, लेकिन एक बैच फ़ाइल में मुझे यह कहते हुए एक त्रुटि मिलती है 'और इस समय अप्रत्याशित था।'
जो जिम

कोई बात नहीं। यह मिला:START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
जो जिम

61

बस जोड़ने और .exe नाम से पहले ऑपरेटर। यहाँ मौन मोड में SQL सर्वर एक्सप्रेस स्थापित करने के लिए एक कमांड है:

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

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

53

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

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

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

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


2
imho यह सबसे अच्छा है! कोई base64, कोई विचित्र -% वाक्यविन्यास जो प्रतिस्थापन को जन्म देता है, सामान्य शक्तियाँ प्रतिस्थापन नियम, कोई भ्रम नहीं, बहुत पठनीय है।
ऐनीएगाइल

1
यह काम नहीं करता है। यदि आपके पैरामीटर में एक पथ का नाम है, तो पथ नाम को कई मापदंडों में विभाजित किया जाएगा।
ब्रेनस्ल्गस83

1
अच्छा उत्तर। हालांकि, क्या यह मापदंडों में उद्धरण के साथ काम करेगा?
अकीरा यामामोटो

कृपया इसे आज़माएं, बाकी सब के बाद यह वास्तव में काम करता है। और पॉवर्सशेल एक्सटेंशन का उपयोग भी करेंEchoArgs
जेरेमी थॉम्पसन

34

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

& '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

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


2
ऐरे निश्चित रूप से सबसे अच्छा विकल्प है - यह मेरे लिए बहुत अच्छा काम करता है। सिवाय मैंने एक सरणी चर पारित कर दिया क्योंकि मेरे तर्क गतिशील थे। धन्यवाद।
जॉन बार्कर

IMHO सबसे अच्छा समाधान
वैसीन यूरी

25

वहाँ काफी कुछ तरीके आप इसे करने के लिए उपयोग कर सकते हैं।

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

विधि 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 पैरामीटर का उपयोग वर्तमान कंसोल विंडो में नई प्रक्रिया को प्रदर्शित करने के लिए किया जाता है। डिफ़ॉल्ट रूप से Windows PowerShell एक नई विंडो खोलता है।

संदर्भ: पॉवर्सशैल / स्क्रिप्टिंग / स्टार्ट-प्रोसेस


सरल हमेशा जीतता है! धन्यवाद।
माइक कैस

उद्धरण चिह्न से बचने पर अंतिम नोट के लिए धन्यवाद!
पाओलो


13

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

.....>। \ file.exe

या

......> full \ path \ to to file.exe


2
यह उस प्रश्न का उत्तर होना चाहिए, यह वह है जिसे हम तब खोज रहे हैं जब हम "PowerShell से प्रारंभ करें" कीवर्ड के साथ खोज करते हैं। धन्यवाद !
जीन-डैनियल गेसर

2
कैसे तर्कों के साथ चल रहा है?
१ene:०५ पर सीरनवेयर छिपकली

1
@SereneWizard अच्छी तरह से, एक। Inbetween के साथ .exe के बाद उन्हें जोड़ें। उदाहरण:। \ File.exe param1 param2 param3
darkgaze

9

मैं निम्नलिखित दृष्टिकोण का उपयोग करके अपने समान कमांड प्राप्त करने में सक्षम था:

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 कनेक्शन स्ट्रिंग के निर्माण में वैकल्पिक कुंजी नामों का उपयोग करें, जिसमें उनके स्थान नहीं हैं। उदाहरण के लिए, "उपयोगकर्ता आईडी" के बजाय "यूआईडी" का उपयोग करें, "डेटा स्रोत" के बजाय "सर्वर", "इंटीग्रेटेड सिक्योरिटी" के बजाय "ट्रस्टेड_कनेक्ट" और इसके बाद। एक बार मैंने कनेक्शन स्ट्रिंग से सभी रिक्त स्थान निकाल देने के बाद ही इसे प्राप्त करने में सक्षम था।

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


2
मैंने अन्य सभी उत्तरों की कोशिश की, लेकिन यह एकमात्र उत्तर था जिसने मेरे लिए काम किया! इस वैकल्पिक मार्ग को प्रदान करने के लिए धन्यवाद।
संवेदनशील

6

PowerShell V3 में नया एस्केप स्ट्रिंग, जिसे नई V3 भाषा से उद्धृत किया गया है :

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

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

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

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

6

आप उपयोग कर सकते हैं:

Start-Process -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"

यहां ध्यान देने योग्य बात यह है कि हेल्प गाइड के अनुसार फाइलपाथ की स्थिति 0 होनी चाहिए। एक कमांडलेट के लिए सहायता गाइड को लागू करने के लिए, बस टाइप करें Get-Help <Commandlet-name> -Detailed। इस मामले में, यह है Get-Help Start-Process -Detailed


5

मैंने सभी सुझावों की कोशिश की लेकिन अभी भी msiexec.exeउन मापदंडों के साथ चलने में असमर्थ था जिनमें रिक्त स्थान शामिल थे। इसलिए मेरा समाधान समाप्त हो गया 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()

3

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

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

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

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

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


1
यह ऑप्स प्रश्न से संबंधित नहीं है, उन्होंने विशेष रूप से पूछा कि अपने पद में लंबे कमांड को कैसे शक्तियुक्त तरीके से चलाना है। फ़ाइल पथ में रिक्त स्थान के साथ एक पॉवरशेल स्क्रिप्ट चलाने का तरीका नहीं।
लीनाड 13

प्रश्न का शीर्षक पढ़ें, रिक्त स्थान लंबाई नहीं है। यह इस तरह की समस्याओं के लिए एक मान्य उत्तर है ताकि साझा करने योग्य हो। क्या आपके पास एक ही समस्या थी और वास्तव में इसे आज़माएं? यदि आप इसे सुधारना चाहते हैं तो एक संपादन सबमिट करें जिसमें प्रश्न में वास्तविक कमांड शामिल है और मैं इसे स्वीकार करूंगा।
टोनी वॉल

3

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"

जब यह Base64 के रूप में एन्कोडेड हो जाता है:

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

आप अलग-अलग तरीकों से exe फ़ाइलों को चला सकते हैं। उदाहरण के लिए यदि आप unrar.exe चलाना चाहते हैं और एक .rar फ़ाइल को निकालना चाहते हैं, तो आप इसे केवल शब्‍दों में लिख सकते हैं:

$extract_path = "C:\Program Files\Containing folder";
$rar_to_extract = "C:\Path_to_arch\file.rar"; #(or.exe if its a big file)  
C:\Path_here\Unrar.exe x -o+ -c- $rar_to_extract $extract_path;

लेकिन कभी-कभी, यह काम नहीं करता है इसलिए आपको ऊपर दिखाए अनुसार & पैरामीटर का उपयोग करना होगा: उदाहरण के लिए, vboxmanage.exe (वर्चुअलबॉक्स वर्चुअल मशीन को प्रबंधित करने का एक उपकरण) के साथ आपको पैरामीटर को स्ट्रिंग के बाहर इस तरह से कॉल करना होगा, बिना उद्धरण:

> $vmname = "misae_unrtes_1234123"; #(name too long, we want to change this)
> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm $vmname --name UBUNTU;

यदि आप .rr फ़ाइल के रूप में केवल एक winrar संग्रहीत फ़ाइल को कॉल करना चाहते हैं, तो आप इसे इनवोक-कमांड cmdlet और एक साइलेंट पैरामीटर / S के साथ अनज़िप भी कर सकते हैं (यह उसी फ़ोल्डर में खुद को निकालने जा रहा है, जहां यह संकुचित है)।

> Invoke-Command -ScriptBlock { C:\Your-path\archivefile.exe /S };

तो कई तरीके हैं चलाने के लिए .exe फ़ाइलों में तर्क के साथ powerhell।

कभी-कभी, इसे ठीक से काम करने के लिए किसी व्यक्ति को वर्कअराउंड ढूंढना चाहिए, जिसके लिए कुछ और प्रयास और दर्द की आवश्यकता हो सकती है :) जिस तरह से .exe संकलित किया गया है या उसके निर्माता बनाए गए हैं।


1

मैं इस सरल, स्वच्छ और प्रभावी विधि का उपयोग करता हूं।

मैं एक सरणी में तर्क देता हूं, 1 प्रति पंक्ति। इस तरह से इसे पढ़ना और संपादित करना बहुत आसान है। तब मैं एक एकल पैरामीटर के साथ एक समारोह में दोहरे उद्धरण चिह्नों के अंदर सभी तर्कों को पारित करने की एक सरल चाल का उपयोग करता हूं। यह उन्हें सारणी सहित समतल करता है, एक एकल स्ट्रिंग के लिए, जिसे मैं तब PS के 'इनवोक-एक्सप्रेशन' का उपयोग करके निष्पादित करता हूं। यह निर्देश विशेष रूप से एक स्ट्रिंग को रननेबल कमांड में बदलने के लिए बनाया गया है। अच्छा काम करता है:

                    # function with one argument will flatten 
                    # all passed-in entries into 1 single string line
Function Execute($command) {
                    # execute:
    Invoke-Expression $command;
                    # if you have trouble try:
  # Invoke-Expression "& $command";
                    # or if you need also output to a variable
  # Invoke-Expression $command | Tee-Object -Variable cmdOutput;

}

#  ... your main code here ...

               # The name of your executable app
$app = 'my_app.exe';
               # List of arguments:
               #    Notice the type of quotes - important !
               #    Those in single quotes are normal strings, like 'Peter'
$args = 'arg1',
        'arg2',
        $some_variable,
        'arg4',
        "arg5='with quotes'",
        'arg6',
        "arg7 \ with \ $other_variable",
        'etc...';

               # pass all arguments inside double quotes
Execute "$app $args";

1

मेरे पास अपने लैपटॉप पर सही काम करने वाला निम्नलिखित कोड था:

& $msdeploy `
-source:package="$publishFile" `
-dest:auto,computerName="$server",includeAcls="False",UserName="$username",Password="$password",AuthType="$auth" `
-allowUntrusted  `
-verb:sync  `
-enableRule:DoNotDeleteRule `
-disableLink:AppPoolExtension  `
-disableLink:ContentExtension  `
-disableLink:CertificateExtension  `
-skip:objectName=filePath,absolutePath="^(.*Web\.config|.*Environment\.config)$" `
-setParam:name=`"IIS Web Application Name`",value="$appName"

फिर जब मैंने उस सर्वर पर सीधे चलने की कोशिश की तो मुझे वे त्रुटियां होने लगीं "Unrecognized argument ...etc.... All arguments must begin with "-". "

सभी संभावित वर्कअराउंड (कोई सफलता नहीं) की कोशिश करने के बाद, मुझे पता चला कि सर्वर पर पॉवर्सशेल (विंडोज 2008 आर 2) संस्करण 3.0 था, जबकि मेरे लैपटॉप में 5.0 है। (आप संस्करण देखने के लिए "$ PSVersionTable" का उपयोग कर सकते हैं)।

पॉवर्सशेल को नवीनतम संस्करण में अपग्रेड करने के बाद इसने फिर से काम करना शुरू कर दिया।


1

Cmd एक उद्धृत exe को चलाने का काम कर सकता है, लेकिन Powershell नहीं कर सकता। मैं सिर्फ exe चलाने से निपटने के लिए जा रहा हूं, क्योंकि मेरे पास यह नहीं है। यदि आपको किसी बाहरी कमांड के तर्क के लिए डबलक्वाट भेजने की आवश्यकता है, तो यह एक और मुद्दा है जिसे कहीं और कवर किया गया है।

1) अपने पथ में exe फ़ोल्डर जोड़ें, शायद आपके $ प्रोफ़ाइल में

$env:path += ';C:\Program Files\IIS\Microsoft Web Deploy\'
msdeploy

2) रिक्त स्थान का निरीक्षण करें:

C:\Program` Files\IIS\Microsoft` Web` Deploy\msdeploy.exe

0

इसलिए, मैं एक समान समस्या में भाग गया और इसे इस तरह हल करने के लिए चुना:

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

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

& {इनवोक-एक्सप्रेशन "C: \ Program Files \ IIS \ Microsoft वेब तैनात \ msdeploy.exe -verb: सिंक -source: dbfullsql =` "डेटा स्रोत = mysource; एकीकृत सुरक्षा = गलत; उपयोगकर्ता नाम = sa; Pwd = sapass ; डेटाबेस; mydb; `" -dest: dbfullsql = `" डेटा स्रोत = .ddourceource; एकीकृत सुरक्षा = गलत; उपयोगकर्ता ID = sa; Pwd = sapass?; डेटाबेस = mydb; `", कम्प्यूटरीकरण = 10.10.10.10, उपयोगकर्ता नाम = व्यवस्थापक, पासवर्ड = adminpass \ _ ""}


0

निष्पादन योग्य नाम के लिए, नए-उर्फ cmdlet को रिक्त स्थान से निपटने या $ PATH वातावरण में निष्पादन योग्य को जोड़ने की आवश्यकता से बचने के लिए नियोजित किया जा सकता है।

PS> new-alias msdeploy "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
PS> msdeploy ...

पीएस उपनामों को सूचीबद्ध या संशोधित करने के लिए भी देखें

PS> get-alias
PS> set-alias

से जेफ़री हिक्स Aarticle

अन्य जवाब तर्कों को संबोधित करते हैं।

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