Powershell 具有多个DefineConstants的命令行msbuild

Powershell 具有多个DefineConstants的命令行msbuild,powershell,batch-file,syntax,msbuild,Powershell,Batch File,Syntax,Msbuild,来自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将分号解

来自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将分号解释为end of语句,并使用单个常量运行,然后尝试运行命令
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"
两个想法:

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

msbuild /nologo "/property:DefineConstants=`"FOO;BAR`""
使用呼叫接线员
(适用于PS v4+)


我们可以将msbuild转义字符用作msbuild/t:rebuild“/property:DefineConstants=PROD%3BCODE\u ANALYSIS”。其中使用%3B;在属性中


上述解决方案都不适用于我,因此我不得不采用另一种方法:

应该注意,虽然这适用于
DefineConstants
属性,但如果路径包含空格,则会中断采用路径的内容。因此,在这种情况下,不要使用此技巧。@GeorgeMauer命令行工具的字符串转义是powershell难以使用的领域之一。我注意到第二个选项在4.0版上对我有效,而不是3.0版。@GeorgeMauer你能举一个带有空格的路径的例子吗?你说的是将属性设置为带空格的路径还是仅设置为项目/sln文件的路径?在我的构建脚本中,我只是尝试按照你的建议转义所有
/property:…
,但这不起作用,因为其中一些用于
OutDir
之类的内容。只有转义
DefineConstants
子句才有效。您可以尝试在路径上使用单引号,类似于
msbuild”/OutDir:“\path\to the\output”
。令人惊讶的是,这只在使用xbuild时有效(msbuild失败)
& msbuild /nologo /property:DefineConstants="FOO;BAR"