间隔路径,msbuild和psake

时间:2012-04-18 16:47:20

标签: powershell msbuild psake

相关问题here

这适用于编译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 }

1 个答案:

答案 0 :(得分: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>


使用this answer中的反斜杠转义选项,我们可以保留变量扩展和封闭引号:

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">