Как вы вызываете msdeploy из powershell, когда параметры имеют пробелы?

У меня возникает проблема с пробелами в моих параметрах, которые я пытаюсь отправить в msdeploy из powershell script.

Существует ряд других связанных статей, но ни одна из них не решает проблему.
Проблемы с использованием Power Shell и MSDeploy.
Аналогичная проблема SO, которая не работает: Как запустить exe в powershell с параметрами с пробелами и кавычками
PowerShell BUG: Выполнение команд, для которых требуются кавычки и переменные, практически невозможно
Еще одна проблема SO, которая не работает: Передача параметров в PowerShell 2.0

Самый простой пример, который преуспевает, а затем терпит неудачу, когда я делаю его более сложным, - это просто сброс веб-сайта по умолчанию.

$msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
& $msdeploy -verb: dump -source: appHostConfig = `` веб-сайт по умолчанию` -verbose
== УСПЕХ

Этот?

$sitename = "веб-сайт по умолчанию"
& $msdeploy -verb: dump -source: appHostConfig = $sitename -verbose
== FAIL со следующей ошибкой
msdeploy.exe: Ошибка: нераспознанный аргумент ' "-source:" appHostConfig = default'. Все аргументы должны начинаться с "-".
В C:\xxx\test.ps1:122 char: 6
+
+ CategoryInfo: NotSpecified: (Ошибка: Unrecogn... начало с "-": String) [], RemoteException
+ FullyQualifiedErrorId: NativeCommandError
Количество ошибок: 1.

Следующие изменения также не удались
#FAIL
$sitename = `` веб-сайт по умолчанию` '
$sitename = `' "веб-сайт по умолчанию" `'
$sitename = "` 'веб-сайт по умолчанию' '"
$sitename = "веб-сайт по умолчанию"
$sitename = "'веб-сайт по умолчанию"

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

Я в недоумении. Все, с кем я работаю, находятся в растерянности. Серьезно это отстой. Я любил Powershell. Я любил msdeploy. Я не могу сказать, что люблю их комбинировать. Похоже, что проще было сосредоточиться на API вместо cli.

EDIT:

Параметры в массиве строк, предложенные императором XLII, хорошо работают. Альтернативное решение представлено в следующей статье: Пробы и невзгоды использования MSDeploy с 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 )
}

Ответ 1

Используя технику из Ответ Кита на Как запустить exe в powershell с параметрами с пробелами и кавычками вопрос, с которым вы связались, работает echoargs -verb:dump -source:appHostConfig=$sitename -verbose дал мне этот вывод:

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

Это объясняет недопустимый аргумент appHostConfig=default, который видел msdeploy.

Запуск echoargs -verb:dump "-source:appHostConfig=$sitename" -verbose, с $sitename = "default web site", приводит к желаемым аргументам:

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

Хотя из вашего списка, похоже, это не сработало для вас.

Другим способом, который вы можете попробовать, является создание списка аргументов в массиве, который powershell может автоматически уйти. Например, это дает тот же результат, что и выше:

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

Ответ 2

Просто добавьте другой способ, если это будет полезно для всех:

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

"-%" является новым для powershell 3. Из здесь: "Вы просто добавляете последовательность% (две тире и знак процента) в любом месте в командной строке и PowerShell не будет пытаться разобрать оставшуюся часть этой строки."

Ответ 3

Мы столкнулись с подобной проблемой. Наше исправление было как показано ниже,

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

где ESC - это escape-последовательность/символ

Ответ 4

Нашел рабочее решение и легкое исправление. Ссылка: 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

Ответ 5

Я пробовал каждую технику под солнцем, и это единственный, который работал у меня (используя 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 )

Ответ 6

Вот еще один подход, основанный на следующем ниже.

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

Это относится к MSDeploy.exe, находящемуся в папке установки по умолчанию, которая содержит пробелы. Следовательно, обертка с escape-символом (`).

Ответ 7

Я использовал некоторые идеи из ответов выше и придумал следующую более простую функцию, чтобы сделать вещь.

Обратите внимание, что важно предоставить полный путь к MSDeploy, так как при запуске под агентом сборки он иногда не распознает PATH для 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 )
    }

Использование

Deploy $hostName $remotePath $source

Ответ 8

Все вышесказанное не помогло мне, это решение, которое сработало:

# 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