Powershell 具有多个DefineConstants的命令行msbuild
来自powershellPowershell 具有多个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将分号解
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"