Как вы вызываете msdeploy из powershell, когда параметры имеют пробелы? - PullRequest
25 голосов
/ 17 августа 2010

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

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

Следующие варианты также потерпели неудачу
# СБОЙ
$ 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, а не на клиенте.

EDIT:

Параметры в массиве строк, предложенные Emperor 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 )
}

Ответы [ 8 ]

14 голосов
/ 17 августа 2010

Используя технику от Ответ Кита до Как запустить 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
10 голосов
/ 19 июня 2015

Просто добавьте другой способ, если он кому-нибудь пригодится:

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

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

6 голосов
/ 10 декабря 2015

Нашли рабочее решение и легко исправить. Справка: 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
6 голосов
/ 10 октября 2012

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

$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-последовательность / символ

3 голосов
/ 22 февраля 2014

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

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

$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-символом (`).

0 голосов
/ 29 сентября 2017

Все вышеперечисленное у меня не сработало, это решение сработало:

# 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
0 голосов
/ 04 октября 2016

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

Обратите внимание, что важно указать полный путь к 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
...