Как вы вызываете 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