【发布时间】:2011-10-13 18:52:50
【问题描述】:
我可以在 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:只能指定一个项目。”
【问题讨论】:
-
以防万一,命令不一样(工作的有两个
/p:...),你用psake试试同样的命令吗? -
另外,我创建了一个测试灵魂,使用了所有带空格的路径,并在 psake 中使用了您的命令。它奏效了。
-
@Roman,我相信我尝试了两者的变体(并且原版将它们放在一起),但你说得对,我应该保持一致。我会坚持单独的版本。您实际在 psake 中工作的代码是否有变量?我可以通过硬编码的 exec 让它工作,但不能用替换。
-
是的,它适用于变量。任务主体是` $SolutionFile = "C:\TEMP\spaced path\ConsoleApplication1.sln" $OutputDir = "C:\\TEMP\\spaced path2\\" exec { msbuild $SolutionFile "/p:MvcBuildViews=False;OutDir =$OutputDir" }`
-
@Roman,哇,谢谢。这样可行。我以为我试过了。我尝试了其他语法变体,包括原始路径(不是双斜杠)。但我想我从未尝试过使用
double_slashed_dir。将其发布为答案,我会接受。
标签: powershell msbuild escaping psake