我有一个 msbuild 脚本,它使用 Exec 标记启动另一个 MSBuild 命令,包括具有多个值的 DefineConstants 属性。由于该属性有多个值,因此我使用此问题中描述的技术直接调用 MSBuild.exe(不使用 MSBuild 标记)并将值括在引号中。
但是,我现在需要在其中一个值中嵌入一个特殊符号,我正在尝试使用代码¯
(注册商标®)
问题是特殊字符代码必须以分号结尾,但是当我嵌入分号时,msbuild 将其读取为值分隔符。我似乎找到了一种有效的方法来转义分号并让它仍然显示在 end 参数值中。
我的问题是:如何将特殊字符嵌入到我的构建参数中?
为了提高可读性,我在示例中将值移动到变量中,但这不是必需的。
文件:TopLevelBuildScript.proj
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="BuildWithSpecialChar">
<ItemGroup>
<!-- Note: %3B is the escape code for semicolon -->
<MyProductName Include="Trademarked&#174%3B Product" />
<OtherProperty Include="foo" />
</ItemGroup>
<Exec Command="msbuild.exe subBuildScript.proj /p:DefineConstants="MyProductName=@(MyProductName);OtherVar=@(foo);AnotherVar=asdf;" " />
</Target>
</Project>
执行时,上面会产生命令行:
msbuild.exe subBuildScript.proj /p:DefineConstants="MyProductName=Trademarked® Product;OtherVar=foo;AnotherVar=asdf;"
最终定义了在分号处拆分产品名称的常量:
MyProductName=Trademarked®
Product
OtherVar=foo
AnotherVar=asdf
注意:我也尝试使用 %25 作为百分号:
<MyProductName Include="Trademarked&#174%253B Product" />
但这给了我:
MyProductName=Trademarked®B Product
OtherVar=foo
AnotherVar=asdf
更新
事实证明,问题不在于 MSBuild,而在于 WiX 解析参数的方式(我的 subBuildScript 使用 WiX)。我没有考虑到这一点,所以在我的原始帖子中没有提到它。
最终,我根据另一个问题的答案提出了一个解决方案:
<PropertyGroup>
<WixValues>
<MyProductName>Trademarked® Product<MyProductName>
<OtherProperty>foo"</OtherProperty>
</WixValues>
</PropertyGroup>
<MSBuild
Projects="subProjectScript.proj"
Properties="Configuration=Release;WixValues=$([MSBuild]::Escape($(WixValues)))"
Targets="Clean;Rebuild"
ContinueOnError="false"
StopOnFirstFailure="true">
</MSBuild>
并取消转义 subProjectScript.proj 中的值,如另一个答案中所述。