2010-10-08 5 views
12

मुझे स्पष्ट रूप से नहीं पता कि मैं क्या कर रहा हूं।इस PowerShell कमांड लाइन उद्धरण/भागने के साथ क्या हो रहा है?

मुझे अंत में यह PowerShell कमांड काम करने के लिए मिला है। लेकिन मैं यह नहीं समझ सकता कि यह क्यों काम करता है।

&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" ` 
    -verb:sync ` 
    -source:contentPath="$build_directory\deploy" ` 
    -dest:contentPath="$server_temp_directory,computerName=$server,username=$server_username,password=$server_password" ` 
    -verbose ` 
    -postSync=runCommand="powershell -NoLogo -NoProfile -Command $server_temp_directory\remotetasks.ps1 Deploy"" 

मैं डबल डबल उद्धरण की आवश्यकता क्यों है:

मेरी चिंता का विषय अंतिम "" वर्ण है?

मेरा आईडीई (पावरगुआई) कहता है कि लाइन सही ढंग से समाप्त नहीं हुई है, लेकिन यह वही तरीका है जिसे मैं वांछित आदेश के रूप में चला सकता हूं।

यह क्या है, कि मैं - और आईडीई - PowerShell में qouting के बारे में नहीं जानता?


echoargs से एक छोटी सी उत्पादन:

अगर मैं चलाएँ:

echoargs -postSync=runCommand="powershell -NoLogo -NoProfile -Command $server_temp_directory\remotetasks.ps1 Deploy"" 

मैं:

Arg 0 is <-postSync=runCommand=powershell -NoLogo -NoProfile -Command \remotetasks.ps1 Deploy> 

अगर मैं बिना डबल डबल उद्धरण चलाने के लिए, मुझे मिलता है:

Arg 0 is <-postSync=runCommand=powershell> 
Arg 1 is <-NoLogo> 
Arg 2 is <-NoProfile> 
Arg 3 is <-Command> 
Arg 4 is <\remotetasks.ps1> 
Arg 5 is <Deploy> 

ध्यान देने योग्य एक और बात यह है कि उपरोक्त आदेश केवल तभी काम करता है जब यह अंतिम तर्क में = इसके बजाय उपयोग करता है।

यह काम नहीं करेगा:

-postSync:runCommand="powershell -NoLogo -NoProfile -Command $server_temp_directory\remotetasks.ps1 Deploy"" 

संपादित

अब मैं इस तरह सरणी समाधान की कोशिश की है:

$arguments = @("-verb:sync", 
       "-source:contentPath=$build_directory\deploy", 
       "-dest:contentPath=$server_temp_directory,computerName=$server,username=$server_username,password=$server_password", 
       "-verbose", 
       "-postSyncOnSuccess:runCommand=powershell -Command $server_temp_directory\remotetasks.ps1 Deploy") 
&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" $arguments 

मैं अभी भी एक ही त्रुटि मिलती है:

त्रुटि: अपरिचित तर्क '' -postSyncOnSucces s: runCommand = powerhell -Command c: \ temp \ kslog \ remotetasks.ps1 "'परिनियोजित करें। सभी तर्क "-" से शुरू होना चाहिए।

क्या मैं यहां कुछ नई चीज़ गलत कर रहा हूं?

उत्तर

11

यह एक कुख्यात मुद्दा है। टिकट "निष्पादन आदेश जो उद्धरण और चर की आवश्यकता है, सबसे व्यावहारिक रूप से असंभव है" सबसे अधिक वोटित बग है: https://connect.microsoft.com/PowerShell/Feedback

आप कुछ कामकाज भी पा सकते हैं। लेकिन मैं आपको सभी पैरामीटर को सर के रूप में लिखने की सलाह दूंगा और इस सरणी के साथ देशी कमांड का आह्वान करने के लिए & ऑपरेटर का उपयोग करें। उत्तर और उदाहरण देखें: Running an EXE file using PowerShell from a directory with spaces in it और Executing a Command stored in a Variable from Powershell

मैं msdeploy.exe साथ काम नहीं किया और अपने मामले के लिए कुछ डेमो कोड प्रदान नहीं कर सकते। लेकिन मैंने इस दृष्टिकोण को कई अन्य मुश्किल देशी आदेशों के लिए पर्याप्त रूप से लागू किया। कृपया, इसे आज़माएं और हमें परिणाम बताएं।

पीएस तकनीकी रूप से यह वास्तव में आपके प्रश्नों का उत्तर नहीं है, लेकिन मुझे लगता है कि आप अभी भी ऐसा करने का एक व्यावहारिक तरीका ढूंढ रहे हैं, इसलिए यह अभी भी सहायक हो सकता है।

+0

उत्तर के लिए धन्यवाद! मैं इस सप्ताह के अंत में कोड से दूर हूं, लेकिन जब मैं सोमवार को वापस आऊंगा तो मैं आपके सुझावों का प्रयास करूंगा। आप सही हैं, कि यह तकनीकी रूप से क्यों डबल डबल qoutes काम करता है का उत्तर नहीं है ... लेकिन अगर यह एक बग, और डिजाइन से नहीं है, तो यह वैसे भी की एक गहरी समझ हो रही लायक नहीं हो सकता है। मैं जल्द ही वापस आऊंगा। – asgerhallas

+0

तो। मैंने पैरामीटर के लिए सरणी का उपयोग करने के संयोजनों के सभी प्रकार की कोशिश की है। कुछ भी काम नहीं करता है। क्या आपको पता है क्यों? – asgerhallas

+0

मैं अपने नए कोशिश ... – asgerhallas

1

सीएमडी-आधारित एमएसडीओपी में व्यक्त "प्रोग्राम फाइल" के बीच व्हाइटस्पेस के अनुवाद से निपटने के लिए पावरशेल की अक्षमता में से एक क्षेत्र पावरशेल की अक्षमता है।

यह एक बहुत ही आधार समाधान है, और प्राचीन डॉस सीमाओं का लाभ उठाता है, लेकिन निम्न गैर-सफ़ेद संदर्भ उनकी जगह में इस्तेमाल किया जा सकता है:

\Program Files\ ... \Progra~1\ 
\Program Files (x86)\ ... \Progra~2\ 

यह लंगड़ा है, लेकिन यह काम करता है।

आप एक ऐसा फ़ंक्शन भी बना सकते हैं जो cmd को कॉल करता है और आपके आदेश को निष्पादित करता है। यह उदाहरण भी मानता है कि आप कॉल करने की कोशिश कर रहे हैं (msdeploy, आदि) पथ में है।

function PushToTarget() { 
    cmd.exe /C $("msdeploy.exe -verb:sync -source:apphostconfig=yourwebapp-dev -dest:archivedir=d:\backup") 
} 
3

मुझे अंत में पता चला कि यह कैसे करें। यहां एक नमूना स्क्रिप्ट है:

$src='c:\sandbox\Test Folder\A' 
$dest='c:\sandbox\Test Folder\B' 
$msdeploy=Get-Command 'C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe' 
$command = "& `$msdeploy --% -verb:sync -source:contentPath=""$src"" -dest:contentPath=""$dest""" 
$sb = $ExecutionContext.InvokeCommand.NewScriptBlock($command) 
& $sb 
+0

यह अंत में मेरे लिए काम किया। धन्यवाद! – ydd1987

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