Come si chiama msdeploy da PowerShell quando i parametri hanno spazi?

Sto incontrando un problema con gli spazi nei miei parametri che cerco di inviare in msdeploy da uno script di PowerShell.

Ci sono un certo numero di altri articoli correlati ma nessuno di loro risolve il problema.
Problemi nell’utilizzo di Power Shell e MSDeploy.
Simile problema SO che non funziona: Come eseguire exe in PowerShell con parametri con spazi e virgolette
PowerShell BUG: l’ esecuzione di comandi che richiedono virgolette e variabili è praticamente imansible
Un altro problema SO che non funziona: passaggio dei parametri in PowerShell 2.0

L’esempio più semplice che riesce e poi fallisce quando lo rendono più complicato è semplicemente scaricare il sito Web predefinito.

$ msdeploy = “C: \ Programmi \ IIS \ Microsoft Web Deploy \ msdeploy.exe”
& $ msdeploy -verb: dump -source: appHostConfig = `’sito web predefinito`’ -verbose
== SUCCESSO

Questo?

$ sitename = “sito web predefinito”
& $ msdeploy -verb: dump -source: appHostConfig = $ sitename -verbose
== FAIL con il seguente errore
msdeploy.exe: Errore: argomento non riconosciuto “” -source: “appHostConfig = default”. Tutti gli argomenti devono iniziare con “-“.
In C: \ xxx \ test.ps1: 122 char: 6
+ &
+ CategoryInfo: NotSpecified: (Errore: Unrecogn … begin with “-” .: String) [], RemoteException
+ FullyQualifiedErrorId: NativeCommandError
Conteggio errori: 1.

Anche le seguenti varianti hanno fallito
#FALLIRE
$ sitename = `’sito web predefinito`’
$ sitename = “” “sito web predefinito” `’
$ sitename = “` ‘sito web predefinito` “”
$ sitename = “sito web predefinito”
$ sitename = “‘sito web predefinito'”

& $ msdeploy -verb: dump “-source: appHostConfig = $ sitename” -verbose
& $ msdeploy -verb: dump -source: appHostConfig = “$ sitename” -verbose
& $ msdeploy -verb: dump -source: appHostConfig = ‘$ sitename’ -verbose
& $ msdeploy -verb: dump -source: appHostConfig = `’$ sitename`’ -verbose
& $ msdeploy -verb: dump -source: appHostConfig = `” $ sitename` “-verbose

Sono in perdita. Tutti quelli con cui lavoro sono in perdita. Seriamente questo fa schifo. Adoro Powershell. Ho adorato msdeploy. Non posso dire che mi piace metterli insieme. Sembra che potrebbe essere stato più facile concentrarsi sull’API anziché sul cli.

MODIFICARE:

I parametri nell’array di stringhe suggerito da Emperor XLII funzionano bene. Una soluzione alternativa è presentata nel seguente articolo: Le prove e le tribolazioni dell’utilizzo di MSDeploy con PowerShell

function PushToTarget([string]$server, [string]$remotePath, [string]$localPath) { cmd.exe /C $("msdeploy.exe -verb:sync -source:contentPath=`"{0}`" -dest:computerName=`"{1}`",contentPath=`"{2}`" -whatif" -f $localPath, $server, $remotePath ) } 

Usando la tecnica dalla risposta di Keith a Come eseguire exe in PowerShell con parametri con spazi e citazioni domande a cui sei collegato, eseguendo echoargs -verb:dump -source:appHostConfig=$sitename -verbose mi ha dato questo risultato:

 Arg 0 is <-verb:dump> Arg 1 is <-source:appHostConfig=default> Arg 2 is  Arg 3 is  Arg 4 is <-verbose> 

Questo spiegherebbe l’argomento non valido di appHostConfig=default che msdeploy stava vedendo.

Esecuzione di echoargs -verb:dump "-source:appHostConfig=$sitename" -verbose , con $sitename = "default web site" , sembra generare gli argomenti desiderati:

 Arg 0 is <-verb:dump> Arg 1 is <-source:appHostConfig=default web site> Arg 2 is <-verbose> 

Anche se dalla tua lista, sembra che questo non ha funzionato per te.

Un altro metodo che potresti provare è creare l’elenco degli argomenti in una matrice, che PowerShell può automaticamente scappare. Ad esempio, questo dà lo stesso risultato di cui sopra:

 [string[]]$msdeployArgs = @( "-verb:dump", "-source:appHostConfig=$sitename", "-verbose" ) echoargs $msdeployArgs 

Basta aggiungere un altro modo nel caso in cui sia utile a chiunque:

 Invoke-Expression "& '[path to msdeploy]\msdeploy.exe' --% -verb:sync -source:contentPath=`'$source`' -dest:contentPath=`'$dest`'" 

“-%” è nuovo in PowerShell 3. Da qui : “Basta aggiungere una sequenza -% (due trattini e un segno di percentuale) in qualsiasi punto della riga di comando e PowerShell non tenterà di analizzare il resto di quella linea. ”

Avevamo affrontato il tipo di problema simile. La nostra correzione era come sotto,

 $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"; 

dove, ESC – è sequenza / carattere di escape

Trovato una soluzione di lavoro e facile soluzione. Riferimento: http://answered.site/all-arguments-must-begin-with–at-cwindowsdtldownloadswebserviceswebservicesidservicepubblicatowebsiteservizionedelavoridiviservisualizzaeployps123/4231580/

 $msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" $msdeployArgs = @( "-verb:sync", "-source:iisApp='Default Web Site/HelloWorld'", "-verbose", "-dest:archiveDir='c:\temp1'" ) Start-Process $msdeploy -NoNewWindow -ArgumentList $msdeployArgs 

Ho provato ogni tecnica sotto il sole, e questo è l’unico che ha funzionato per me (usando PowerShell 2).

 cmd.exe /C $("msdeploy.exe -verb:sync -source:package=`"{0}`" -dest:auto,IncludeAcls=`"False`" -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -setParamFile:`"{1}`"" -f $mypackagepath, $myparamfilepath ) 

Ecco un altro approccio derivato dall’input qui sotto.

 $msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe"; $command = "-verb:sync"; $sourcePath = "C:\aa aa\"; $source = $("-source:contentPath=`"{0}`"" -f $sourcePath); $destPath = "C:\aa" $destination = $("-dest:contentPath=`"{0}`" -f $destPath); $msdeploycommand = $("`"{0}`" {1} {2} {3} -verbose" -f $msdeploy, $command, $source, $destination); cmd.exe /C "`"$msdeploycommand`""; 

Questo fa sì che MSDeploy.exe si trovi nella sua cartella di installazione predefinita che contiene spazi. Da qui il wrapping con il carattere di escape (`).

Ho usato alcune idee dalle risposte sopra e ho trovato la seguente funzione più semplice per fare la cosa.

Si noti che è importante fornire il percorso completo a MSDeploy come quando si esegue l’agente di build a volte non riconosce il PERCORSO in msdeploy.

 function Deploy([string]$server, [string]$remotePath, [string]$localPath) { $msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe"; cmd.exe /C $("`"{3}`" -verb:sync -source:contentPath=`"{0}`" -dest:computerName=`"{1}`",contentPath=`"{2}`" " -f $localPath, $server, $remotePath , $msdeploy ) } 

uso

 Deploy $hostName $remotePath $source 

Tutto quanto sopra non ha funzionato per me, questa è la soluzione che ha funzionato:

 # get msdeploy exe $MSDeploy = ${env:ProgramFiles}, ${env:ProgramFiles(x86)} | ForEach-Object {Get-ChildItem -Path $_ -Filter 'MSDeploy.exe' -Recurse} | Sort-Object -Property @{Expression={[version]$_.VersionInfo.FileVersion}} -Descending | Select-Object -First 1 -ExpandProperty FullName #build deploy command $deplyCmd = """""$MSDeploy"" -verb:sync -dest:iisApp=""Default Web Site"" -enableRule:DoNotDeleteRule -source:iisApp=""$ExtraWebFilesFolder""" #execute &cmd /c $deplyCmd