说我有一个属性:
<MyProp>Foo=Bar;Hello=World</MyProp>
这似乎是MSBuild中一个相当常见的属性模式。我将如何获取价值&#34; World&#34;?在一个理想的世界中,这可能看起来像:
$(MyProp).(Hello)
编辑:要清楚,该属性是不我自己的创建,它是另一个目标的输出超出我的控制,所以我不能改变声明属性的方式。
答案 0 :(得分:2)
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MyProp>Foo=Bar;Hello=World</MyProp>
</PropertyGroup>
<Target Name="Foo">
<CreateItem Include="MyProp" AdditionalMetadata="$(MyProp)">
<Output TaskParameter="Include" ItemName="MyProp" />
</CreateItem>
<Message Text="Foo %(MyProp.Foo)" />
<Message Text="Hello %(MyProp.Hello)" />
</Target>
</Project>
答案 1 :(得分:1)
就我而言,你有两条路线可以关注
<PropertyGroup> <Foo>Bar</Foo> <Hello>World</Hello> </PropertyGroup>
然后使用以下方法访问您的属性
<Target Name="DoSomething"> <Message Text="Print this : $(Foo)" /> </Target>
或者您可能希望采用ItemGroup Element方式,如下所示
<ItemGroup>
<MySolutionFiles Include="..\mySolution.sln" />
</ItemGroup>
<Target Name="PrintItems">
<Message Text="My Files: @(MySolutionFiles)" />
</Target>
您也可以拥有以下内容
<ItemGroup> <MyProp Include="Foo;Hello" /> </ItemGroup> <Target Name="PrintMyItems"> <Message Text="MyProp: @(MyProp)" /> </Target>
如果对输入没有选择,那么一种可能的解决方案是将输入解析为数组,然后从那里取出它,如下所示:
<PropertyGroup> <MyProp>Foo=Bar;Hello=World</MyProp> <Split>$(MyProp.Split(';'))</Split> </PropertyGroup>
然后使用以下数组项进行播放:
<Target Name="DoPrint"> <Message text="$(Split[0])" /> </Target>
Split [0]项包含你的Foo = Bar,它可以像上面一样分成另外两个字符串。这应该让你现在继续。
答案 2 :(得分:0)
您不需要属性组,如果用户没有传递默认值,那么它很不错。
对于您传递的每个属性,访问该属性的语法是$(PropertyName)。
所以如果你通过:
msbuild.exe / p:P1 = V1 / p:P2 = V2; P3 = V3
您将使用属性名称$(P1),$(P2),$(P3)。
有关MsBuild属性的更多信息here。