25

PowerShell スクリプトから msdeploy に送信しようとしているパラメーターのスペースに問題が発生しています。

他にも関連する記事がいくつかありますが、どれも問題を解決していません。
Power Shell と MSDeploy の使用に関する問題。
動作しない同様の SO 問題:スペースと引用符を含むパラメーターを使用してPowerShellで exe を実行する 方法

成功し、さらに複雑にすると失敗する最も単純な例は、デフォルトの Web サイトをダンプすることです。

$msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
&$msdeploy -verb:dump -source:appHostConfig=`'既定の Web サイト`' -verbose
== SUCCESS

これです?

$sitename="default web site"
&$msdeploy -verb:dump -source:appHostConfig=$sitename -verbose
== 次のエラー
msdeploy.exe で失敗: エラー: 認識されない引数 '"-source:"appHostConfig=default'. すべての引数は「-」で始める必要があります。
At C:\xxx\test.ps1:122 char:6
+ &
+ CategoryInfo : NotSpecified: (Error: Unrecogn...begin with "-".:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
エラー数: 1.

次の バリエーション も失敗 し
まし た $sitename="'既定の Web サイト'"




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

私は途方に暮れています。私が一緒に働いている人は皆途方に暮れています。マジでこれはヤバい。私はパワーシェルが大好きでした。私は msdeploy が大好きでした。それらを組み合わせるのが好きだとは言えません。cli ではなく API に集中する方が簡単だったようです。

編集:

Emperor XLII によって提案された文字列配列のパラメーターはうまく機能します。別の解決策は、次の記事で紹介されています: The Tribulations of using MSDeploy with 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 )
}
4

9 に答える 9

14

キースの回答からのテクニックを使用して、スペースと引用符を含むパラメーターを使用してpowershellでexeを実行する方法の質問にリンクすると、実行すると次の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> 

あなたのリストによると、これはうまくいかなかったようです。

もう 1 つの方法として、配列内に引数のリストを作成する方法があります。これは、powershell が自動的にエスケープできます。たとえば、上記と同じ出力が得られます。

[string[]]$msdeployArgs = @(
  "-verb:dump",
  "-source:appHostConfig=$sitename",
  "-verbose"
)
echoargs $msdeployArgs
于 2010-08-17T13:41:46.583 に答える
10

誰にとっても役立つ場合に備えて、別の方法を追加するだけです:

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

「--%」はpowershell 3の新機能です。ここから:「コマンドラインの任意の場所に --% シーケンス(2つのダッシュとパーセント記号)を追加するだけで、PowerShellはその行の残りを解析しようとしません。 "

于 2015-06-19T17:47:57.003 に答える
7

実用的な解決策と簡単な修正が見つかりました。参照: 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
于 2015-12-10T07:28:58.157 に答える
6

私たちは似たような問題に直面していました。私たちの修正は以下のようでした、

$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- はエスケープ シーケンス/文字です

于 2012-10-10T06:12:56.947 に答える
1

これは、以下の入力から派生した別のアプローチです。

$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 がスペースを含む既定のインストール フォルダーに配置されます。したがって、エスケープ文字 (`) で囲みます。

于 2014-08-07T23:51:38.623 に答える
0

上記の回答からいくつかのアイデアを使用し、次のより単純な関数を思いつきました。

ビルド エージェントで実行する場合、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
于 2016-10-03T23:35:55.637 に答える