¿Cómo se llama a msdeploy desde powershell cuando los parámetros tienen espacios?

Me encuentro con un problema con espacios en mis parámetros que trato de enviar a msdeploy desde un script de powershell.

Hay una serie de otros artículos relacionados, pero ninguno de ellos resuelve el problema.
Problemas al utilizar Power Shell y MSDeploy.
Problema SO similar que no funciona: Cómo ejecutar exe en powershell con parámetros con espacios y comillas
ERROR de PowerShell: la ejecución de comandos que requieren comillas y variables es prácticamente imposible
Otro problema SO que no funciona: Pasar parámetros en PowerShell 2.0

El ejemplo más simple que tiene éxito y luego falla cuando lo hago más complicado es simplemente eliminar el sitio web predeterminado.

$ msdeploy = “C: \ Archivos de progtwig \ IIS \ Microsoft Web Deploy \ msdeploy.exe”
& $ msdeploy -verb: dump -source: appHostConfig = `’sitio web predeterminado“ -verbose
== ÉXITO

¿Éste?

$ sitename = “sitio web predeterminado”
& $ msdeploy -verb: dump -source: appHostConfig = $ nombre-de-sitio -verbose
== FALLA con el siguiente error
msdeploy.exe: Error: argumento no reconocido ‘”-source:” appHostConfig = default’. Todos los argumentos deben comenzar con “-“.
En C: \ xxx \ test.ps1: 122 char: 6
+ Y
+ CategoryInfo: NotSpecified: (Error: No reconocido … begin with “-” .: String) [], RemoteException
+ FullyQualifiedErrorId: NativeCommandError
Cuenta de error: 1.

Las siguientes variaciones también han fallado
#FALLAR
$ sitename = `’sitio web predeterminado’ ‘
$ sitename = `'” sitio web predeterminado “`’
$ sitename = “` `sitio web predeterminado` ‘”
$ sitename = “sitio web predeterminado”
$ sitename = “‘sitio web predeterminado'”

& $ msdeploy -verb: dump “-source: appHostConfig = $ nombre-de-sitio” -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

Estoy perdido Todas las personas con las que trabajo están perdidas. En serio, esto apesta. Me encantó Powershell. Me encantó msdeploy. No puedo decir que me encanta juntarlos. Parece que puede haber sido más fácil enfocarse en la API en lugar de en la cli.

EDITAR:

Los parámetros en la matriz de cadenas sugeridos por Emperor XLII funcionan bien. Una solución alternativa se presenta en el siguiente artículo: Las pruebas y tribulaciones del uso de 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 técnica de la respuesta de Keith a Cómo ejecutar exe en powershell con parámetros con espacios y comillas a las que te echoargs -verb:dump -source:appHostConfig=$sitename -verbose , ejecutando echoargs -verb:dump -source:appHostConfig=$sitename -verbose me dio esta salida:

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

Esto explicaría el argumento inválido de appHostConfig=default que msdeploy estaba viendo.

Ejecutando echoargs -verb:dump "-source:appHostConfig=$sitename" -verbose , con $sitename = "default web site" , parece dar como resultado los argumentos deseados:

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

Aunque de su lista, parece que esto no funcionó para usted.

Otro método que puede probar es crear la lista de argumentos en una matriz, que PowerShell puede escaparse automáticamente. Por ejemplo, esto da el mismo resultado que arriba:

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

Simplemente agregando otra forma en caso de que sea útil para cualquier persona:

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

“-%” es nuevo en PowerShell 3. Desde aquí : “Simplemente agrega una secuencia% – (dos guiones y un signo de porcentaje) en cualquier lugar de la línea de comandos y PowerShell no intentará analizar el rest de esa línea. ”

Nos habíamos enfrentado al tipo similar de problema. Nuestra solución fue como a continuación,

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

donde, ESC – es secuencia de escape / personaje

Encontré una solución de trabajo y solución fácil. Referencia: http://answered.site/all-arguments-must-begin-with–at-cwindowsdtldownloadswebserviceswebservicesidservicepublishedwebsitesidservicedeploymentidservicewsdeployps123/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 

Probé todas las técnicas bajo el sol, y esta es la única que funcionó para mí (utilizando 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 ) 

Aquí hay otro enfoque derivado de la entrada a continuación.

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

Esto sirve para que MSDeploy.exe se encuentre en su carpeta de instalación predeterminada que contiene espacios. De ahí la envoltura con el carácter de escape (`).

He utilizado algunas ideas de las respuestas anteriores y se me ocurrió la siguiente función más simple para hacer el trabajo.

Tenga en cuenta que es importante dar la ruta completa a MSDeploy, ya que cuando se ejecuta bajo el agente de comstackción, a veces no reconoce la RUTA a 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 

Todo lo anterior no funcionó para mí, esta es la solución que funcionó:

 # 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