使用命令行的msbuild和多个DefineConstants

6

来自PowerShell

Set-Alias msbuild C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe

并且需要从与我的sln文件相同的目录运行

> msbuild /nologo /property:DefineConstants=FOO

这个程序可以正常运行。假设我需要两个构建时常量。

> msbuild /nologo /property:DefineConstants=FOO;BAR

PowerShell将分号解释为语句结束符,因此只会执行单个常量,然后尝试运行命令BAR并报错。这不是我想要的。

那么怎么办呢?

> msbuild /nologo /property:DefineConstants="FOO;BAR"
MSBUILD : error MSB1006: Property is not valid.
Switch: BAR

这个也不起作用。不确定发生了什么,但它似乎将“FOO;BAR”解释为某种单一的东西,而不是两个常量。

那么。我该如何传入多个常量?

编辑 经过进一步调查,我在cmd.exe中运行以下命令:

>C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe /nologo /property:DefineConstants=FOO;BAR
MSBUILD : error MSB1006: Property is not valid.
Switch: BAR

尽管这个可以运行。
>C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe /nologo /property:DefineConstants="FOO;BAR"
3个回答

8

2
令人惊讶的是,只有在使用xbuild时才能正常工作(使用msbuild会失败)。 - knocte

7

两个想法:

在属性标志周围添加引号并转义双引号。

msbuild /nologo "/property:DefineConstants=`"FOO;BAR`""

使用调用运算符&(适用于PS v4+)
& msbuild /nologo /property:DefineConstants="FOO;BAR"

@GeorgeMauer 字符串转义在命令行工具中是PowerShell难以使用的领域之一。我注意到第二个选项在4.0版本上适用于我,但不适用于3.0版本。 - Mike Zboray
在我的构建脚本中,我尝试像你建议的那样转义所有的/property:...,但这并不起作用,因为其中一些是用于像 OutDir 这样的东西。只有转义 DefineConstants 从句才可以正常工作。 - George Mauer
你可以尝试在路径上使用单引号,例如 msbuild "/OutDir:'\path\to the\output'" - Mike Zboray
实际上你可以引用整个属性,例如 msbuild /nologo "/property:OutDir=c:\My Secret Apps\bin" "/property:DefineConstants=\"FOO;BAR`"` - George Mauer
常量也可以用简单的空格字符分隔:"/p:DefineConstants=FOO BAR" - jwaliszko
显示剩余2条评论

1

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