1

関連する質問はこちら.

これは、mvc3 アプリケーションのコンパイルでは適切に機能します。

task Compile 
{
    $config = $script:siteConfig.config

    exec { & "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" $webproject_path `
    /p:Configuration=$config /p:WebProjectOutputDir="$publish_dir" `
    /p:Outdir="$out_dir" /p:CleanWebProjectOutputDir=False `
    /T:_WPPCopyWebApplication /T:ResolveReferences /verbosity:quiet /nologo }
}

これらのパス変数はすべてスクリプト プロパティです。ただし、これらの計算されたパスにスペースが導入された場合 (たとえば、プロジェクトが C:\Projects\ から C:\Users\ASDFG1\Documents\Visual Studio 2010\Projects に移動された場合)、msbuild は複数のプロジェクト ファイルがあると見なします。これは理にかなっていますが、何かが欠けている必要があります。解析された変数を引用符で囲むことは、それほど難しいことではありません。

試したバリエーション

exec { Invoke-Expression "& C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe '$webproject_path' /p:Configuration=$config /p:WebProjectOutputDir='$publish_dir' /p:Outdir='$out_dir' /p:CleanWebProjectOutputDir=False /T:_WPPCopyWebApplication /T:ResolveReferences /verbosity:quiet /nologo" }

exec { C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "`"$webproject_path`"" `
/p:Configuration=$config /p:WebProjectOutputDir="`"$publish_dir`"" `
/p:Outdir="`"$out_dir`"" /p:CleanWebProjectOutputDir=False `
/T:_WPPCopyWebApplication /T:ResolveReferences /verbosity:quiet /nologo }
4

1 に答える 1

0

を使用EchoArgs.exeして問題を再現すると、引用符が実行可能ファイルに適切に渡されていないことがわかります。

PS> $publish_dir = 'C:\Users\Documents\Visual Studio 2010\Projects'
PS> ./echoargs /p:WebProjectOutputDir="$publish_dir"
Arg 0 is </p:WebProjectOutputDir=C:\Users\Documents\Visual Studio 2010\Projects>

PS> ./echoargs /p:WebProjectOutputDir="`"$publish_dir`""
Arg 0 is </p:WebProjectOutputDir=C:\Users\Documents\Visual>
Arg 1 is <Studio>
Arg 2 is <2010\Projects>


この回答 のバックスラッシュ エスケープ オプションを使用すると、変数展開とそれを囲む引用符を保持できます。

PS> ./echoargs /p:WebProjectOutputDir=\`"$publish_dir\`"
Arg 0 is </p:WebProjectOutputDir="C:\Users\Documents\Visual Studio 2010\Projects">

ここで、バッククォートは PowerShell に引用符文字をリテラル値として扱うように指示し、バックスラッシュは呼び出し呼び出しに引用符を保持するように指示します。


$publish_dirまたは、変数 をインライン化する代わりに、完全な引数を事前に評価することにより、単一レベルのエスケープに固執することもできます。

PS> $publishArg = '/p:WebProjectOutputDir=\"{0}\"' -f $publish_dir
PS> ./echoargs $publishArg
Arg 0 is </p:WebProjectOutputDir="C:\Users\Documents\Visual Studio 2010\Projects">
于 2012-06-23T21:50:28.473 に答える