我可以在PowerShell中执行以下命令:
msbuild "c:\some\spaced path\project.sln" /p:MvcBuildViews=False /p:OutDir="c:\\some\\spaced path\\deploy\\Package\\"
路径已更改,但实际路径也包含间隔组件。双斜线是一种技巧,例如this answer
如果我直接运行,msbuild
了解路径。但是,它需要像这样在psake中运行:
exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=$OutputDir" }
如果路径没有空格,那么它可以工作,但是我想让它适应空间(对于sln路径和OutDir)。我试过了,但我无法弄清楚逃跑。
编辑:
为了澄清,如果我在psake中硬编码完整路径,它也有效:
exec { msbuild "c:\some\spaced path\project.sln" /p:MvcBuildViews=False /p:OutDir="c:\\some\\spaced path\\deploy\\Package\\" }
但是,它需要使用OutputDir变量(不是双斜杠转义)。因此,我为此添加一个临时变量,然后尝试构造命令行。:
$double_slashed_dir = $OutputDir.Replace('\', '\\');
write $double_slashed_dir;
exec { msbuild $SolutionFile /p:MvcBuildViews=False "/p:OutDir=`"$double_slashed_dir`"" }
这不起作用(我尝试了几种变体)。有了上面的内容,我得到“MSB1008:只能指定一个项目。”
答案 0 :(得分:2)
这种变化对我有用($OutputDir
中的双斜线和斜杠似乎很重要):
task build {
$SolutionFile = "C:\TEMP\spaced path\ConsoleApplication1.sln"
$OutputDir = "C:\\TEMP\\spaced path2\\"
exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=$OutputDir" }
}
答案 1 :(得分:0)
你想在你的OutDir周围加上引号,但是由于你的参数中的其他引号,放置单引号会使命令shell解析器混淆,所以你需要通过双引号来转义这些引号:
exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir=`"`"$OutputDir`"`"" }
答案 2 :(得分:0)
我尝试使用以下内容并且有效。我添加的唯一内容是在msbuild命令之后的双引号(“)。这是我尝试过的:
properties{
$build_Dir="F:\projects\tweet sharp\src";
}
Task Default -depends Build
Task Build {
Exec { msbuild "$build_Dir\TweetSharp.sln" }
}
如您所见,构建目录包含一个空格('tweet sharp')。只需尝试在双引号中包含msbuild任务的所有参数,并检查它是否有效。
答案 3 :(得分:0)
我使用了Invoke-Expression
:
$double_slashed_dir = $OutputDir.Replace('\', '\\');
$msbuild_command = 'msbuild "' + $SolutionFile + '" /p:MvcBuildViews=False /p:OutDir="' + $double_slashed_dir + '"';
exec { Invoke-Expression $msbuild_command }
我认为这有点hackish。它需要字符串连接,据我所知,Invoke-Expression
基本上是eval(尽管它应该是安全的,因为这里没有涉及用户输入)。
所以我现在暂时搁置这个问题,希望得到更好的答案。它应该清楚地显示变量。