12

私は明らかに自分が何をしているのかわかりません。

ようやくこの PowerShell コマンドが機能するようになりました。しかし、なぜそれが機能するのかわかりません。

私の懸念は、最後の "" 文字です。

    &"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" `
    -verb:sync `
    -source:contentPath="$build_directory\deploy" `
    -dest:contentPath="$server_temp_directory,computerName=$server,username=$server_username,password=$server_password" `
    -verbose `
    -postSync=runCommand="powershell -NoLogo -NoProfile -Command $server_temp_directory\remotetasks.ps1 Deploy""

二重引用符が必要なのはなぜですか?

私のIDE(PowerGUI)は、行が正しく終了していないと言っていますが、それがコマンドを必要に応じて実行できる唯一の方法です。

私と IDE が PowerShell での引用について知らないのは何ですか?


echoargs からの小さな出力:

私が実行した場合:

echoargs -postSync=runCommand="powershell -NoLogo -NoProfile -Command $server_temp_directory\remotetasks.ps1 Deploy""

私は得る:

Arg 0 is <-postSync=runCommand=powershell -NoLogo -NoProfile -Command \remotetasks.ps1 Deploy>

二重引用符なしで実行すると、次のようになります。

Arg 0 is <-postSync=runCommand=powershell>
Arg 1 is <-NoLogo>
Arg 2 is <-NoProfile>
Arg 3 is <-Command>
Arg 4 is <\remotetasks.ps1>
Arg 5 is <Deploy>

注意すべきもう 1 つの点は、上記のコマンドは:、最後の引数の代わりに = を使用した場合にのみ機能することです。

これはうまくいきません:

-postSync:runCommand="powershell -NoLogo -NoProfile -Command $server_temp_directory\remotetasks.ps1 Deploy""

私は次のような配列ソリューションを試しました:

$arguments = @("-verb:sync",
               "-source:contentPath=$build_directory\deploy",
               "-dest:contentPath=$server_temp_directory,computerName=$server,username=$server_username,password=$server_password",
               "-verbose",
               "-postSyncOnSuccess:runCommand=powershell -Command $server_temp_directory\remotetasks.ps1 Deploy")
&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" $arguments

それでも同じエラーが発生します。

エラー: 認識されない引数 '"-postSyncOnSuccess:runCommand=powershell -Command c:\temp\kslog\remotetasks.ps1 Deploy"'. すべての引数は「-」で始める必要があります。

ここで何か新しいことを間違っていますか?

4

3 に答える 3

11

これは悪名高い問題です。「引用符と変数を必要とするコマンドの実行は事実上不可能」というチケットは、最も投票数の多いバグです: https://connect.microsoft.com/PowerShell/Feedback

いくつかの回避策もあります。ただし、すべてのパラメーターを配列として構成し、演算子を使用&してこの配列でネイティブ コマンドを呼び出すことをお勧めします。回答と例を参照してください: スペースを含むディレクトリから PowerShell を使用して EXE ファイルを実行する および Powershell から変数に格納されたコマンドを実行する

私はmsdeploy.exeあなたのケースのデモ コードを提供できませんでした。しかし、私はこのアプローチを他の多くのトリッキーなネイティブ コマンドに十分に適用しました。試してみて、結果をお知らせください。

PS技術的には、これはあなたの質問に対する正確な回答ではありませんが、これを行うための実用的な方法をまだ探していると思いますので、それでも役立つかもしれません.

于 2010-10-08T12:28:05.080 に答える
3

私はついにこれを行う方法を見つけました。サンプル スクリプトを次に示します。

$src = 'C:\sandbox\Test Folder\A'
$dest = 'C:\sandbox\Test Folder\B'
$msdeploy = Get-Command 'C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe'
$command = "& `$msdeploy --% -verb:sync -source:contentPath=""$src"" -dest:contentPath=""$dest"""
$sb = $ExecutionContext.InvokeCommand.NewScriptBlock($command)
& $sb
于 2013-08-08T15:06:34.820 に答える
1

ここで問題となっている領域の1つは、PowerShellがcmdベースのmsdeployで表現された「プログラムファイル」間の空白の変換に対処できないことです。

これは非常に基本的なソリューションであり、時代遅れのDOS制限を利用しますが、代わりに次の非空白参照を使用できます。

\Program Files\ ... \Progra~1\
\Program Files (x86)\ ... \Progra~2\

それはラメですが、それは機能します。

cmdを呼び出してコマンドを実行する関数を作成することもできます。この例では、呼び出しようとしているもの(msdeployなど)がパスにあることも前提としています。

function PushToTarget() {
     cmd.exe /C $("msdeploy.exe -verb:sync -source:apphostconfig=yourwebapp-dev -dest:archivedir=d:\backup")
}
于 2013-02-13T20:42:15.837 に答える