如何在 MSBuild WebProjectOutputDir 中添加空格?

21

我正在尝试从命令行调用MSBuild。当我使用没有空格的路径时,一切正常,但现在我有一个带有空格的路径,该命令无法执行。

命令(有效):


"C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
/t:Rebuild "C:\Projects\myProject.csproj" 
/p:OutDir=c:\temp\deploy\funAndGames\Deployment\bin\ 
/p:WebProjectOutputDir=c:\temp\deploy\funAndGames\Deployment\ 
/p:Configuration=Release

我后来加了引号,并将OutDir更改为OutPath(不起作用):

"C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
/t:Rebuild "C:\Projects\myProject.csproj" 
/p:OutPath="c:\temp\deploy\funAndGames\Deployment\bin\" 
/p:WebProjectOutputDir="c:\temp\deploy\funAndGames\Deployment\" 
/p:Configuration=Release

我希望的是这样的效果(不起作用):
"C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
/t:Rebuild "C:\Projects\myProject.csproj" 
/p:OutPath="c:\temp\deploy\fun and games\Deployment\bin\" 
/p:WebProjectOutputDir="c:\temp\deploy\fun and games\Deployment\" 
/p:Configuration=Release

关于OutDir/OutPath和WebProjectOutputDir的语法,有没有关于带空格的问题的帮助?是否可能?如果不可能,有人知道原因吗(因为某些Url不允许带空格之类的原因)?

7个回答

24

刚刚在一个旧问题的答案中发现了这个。为了处理空格,你应该在所有文件夹上使用转义字符 \。基本上

/p:OutPath="c:\temp\deploy\fun and games\Deployment\bin\"
应该是这样的。
/p:OutPath="c:\\temp\\deploy\\fun and games\\Deployment\\bin\\"

神奇的是它能正常工作!


太好了!看起来MSBuild有一些奇怪的自定义方式来解释命令行。感谢您发布您的结果。 - jpierson
4
当您使用像$(ProjectDir)这样的宏时,如何进行此操作? - Mateo
2
@Mateo,你可以使用以下代码:/p:ProjectDir="$(ProjectDir.Replace('\','\\'))" - user247702

5

尝试添加" 例如:

/p:OutPath=""c:\temp\deploy\fun and games\Deployment\bin\""

您可以使用 ctrl+k 或编辑器窗口上方的 {} 按钮进行代码格式化。 - stema

4

如果你将 \ 替换为 / 并使用引号,Msbuild也似乎可以在 OutDir 中使用空格:

/p:OutDir="c:/temp/deploy/fun and games/out/"
/p:WebProjectOutputDir="c:/temp/deploy/fun and games/Deployment/"

也可以使用 /p:AspnetMergePath="C:/Program Files (x86)/Microsoft SDKs/Windows/v8.0A/bin/NETFX 4.0 Tools/",我刚刚发现。反斜杠失败了。 - Trey Mack

2

对我来说,解决方案是:

/p:SQLCMD="\"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE\""

换句话说:将整个字符串放入引号中(外部引号不作为值传递给MSBuild)。

此属性在MSBuild内的值为:"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE"(带引号)。


1
如果在switch语句中有多个参数,你不能通过修复路径来真正“避免”这个问题。你可以做的是将switch语句的参数放在“一些参数1 一些参数2”之间。
类似于:
```` "一些参数1 一些参数2" ````
<Exec Command="SomeCommand /useMultipleParameterSwitch=&quot;value1:blabla1 | value2:blabla2&quot;"/>

当然,很多情况取决于开关的语法,但对我和我的团队来说这很有效。


<Exec Command="$(SomeCommand) /multipleSwitch="someRule:someValue | someRule2:someValue2"" /> 这应该在上面的“类似于”中。 - Valentin Yanakiev

1
> "C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe"
> /t:Rebuild
> "C:\Projects\myProject.csproj" 
/p:OutPath="c:\temp\deploy\funAndGames\Deployment\bin\"
----------------------------------------
/p:WebProjectOutputDir="c:\temp\deploy\fun and games\Deployment\"
----------------------------------------

> /p:Configuration=Release

试试这个。

也可以尝试通过VSStudio GUI。然后复制设置并尝试使用MS Build。


0

如果你在使用 .proj 文件时,路径已经包含在属性中,例如 $(DeployFolder) 和 $(NuGetExe),那么你可以像这样使用 "&quot;":

<Exec Command="&quot;$(NuGetExe)&quot; pack -OutputDirectory &quot;$(DeployFolder)&quot;" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接