如何在MSBuild 4中按多个字符拆分字符串?

如何在MSBuild 4中按多个字符拆分字符串?,msbuild,msbuild-4.0,Msbuild,Msbuild 4.0,我有一个名为MasterVersion的字符串: 1.1-SNAPSHOT 我需要把它分成两份。因此它变成了一个名为SplitVersion的string[]数组,即: 1 1 SNAPSHOT 我已经尝试了我能想到的一切,包括以下十几种变体,但毫无乐趣: <!-- doesn't work --> <ItemGroup> <VersionDelimiters Include="." /> <VersionDelimiters Inc

我有一个名为
MasterVersion
的字符串:

1.1-SNAPSHOT
我需要把它分成两份。因此它变成了一个名为
SplitVersion
string[]
数组,即:

1
1
SNAPSHOT
我已经尝试了我能想到的一切,包括以下十几种变体,但毫无乐趣:

<!-- doesn't work -->
<ItemGroup>
    <VersionDelimiters Include="." />
    <VersionDelimiters Include="-" />
    <SplitVersion Include="$(MasterVersion.Split(@VersionDelimiters))" />
</ItemGroup>

<!-- doesn't work either -->
<ItemGroup>
    <SplitVersion Include="$(MasterVersion.Split([`.`; `-`]))" />
</ItemGroup>

我遗漏了/弄糟了什么晦涩难懂的MSBuild语法?

也许吧

<ItemGroup>
    <SplitVersion Include="$(MasterVersion.Split('.','-'))" />
</ItemGroup>


(MSBuild应自动将其转换为数组)

如果在ItemGroup中使用此表达式,ItemGroup用于收集生成所需的构件。我想你在找一个地产集团

像这样的

<PropertyGroup>
  <MasterVersion>1.1-SNAPSHOT</MasterVersion>
  <SplitVersion Include="$(MasterVersion.Split(`.`,`-`)" />
</PropertyGroup>

1.1-快照
您应该记住,在MSBuild中使用$(美元符号)引用属性。使用@(at符号)引用项目


根据MasterVersion组的不同,您必须将$to@

MSBuild 4.0属性函数更改为不能处理数组(基本上是这样),但是当您执行

Split(`,`, `-`)
您正在调用
String.Split(params String[])
重载,该重载需要一个数组(即使在C#中,
params
关键字也会在场景后面创建一个数组,并在内部执行类似
Split(新字符串[]{',','-})
的操作)

您可以执行以下操作:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
 ToolsVersion="4.0">

    <PropertyGroup>
        <MasterVersion>1.1-SNAPSHOT</MasterVersion>
    </PropertyGroup>

    <ItemGroup>
        <SplitVersion Include="$(MasterVersion.Replace(`-`, `.`).Split(`.`))" />
    </ItemGroup>

    <Target Name="Test">
        <Message Importance="high" Text="@(SplitVersion)"/>
    </Target>
</Project>

数组索引操作符在这里工作,因为在本例中,您仍然处于.NET表达式的“上下文”中。一旦分配给属性(或项目组),您就不能再这样做了。

这不会解析,因为属性上不能有
Include
属性。是的,这是正确的,当像$(MasterVersion.Split('.','-')一样使用它时,它应该可以工作。不,它不会。首先,它缺少一个结束符',其次,请参阅我关于阵列支持的回答。
错误MSB4184:无法计算表达式“1.1-SNAPSHOT”.Split(,-)”。输入字符串的格式不正确。
完成此操作后,
SplitVersion
的内容是什么?它大概是一个
ITaskItem
数组吗?我如何单独访问这些值,比如通过索引?
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    <PropertyGroup>
        <MasterVersion>1.1-SNAPSHOT</MasterVersion>
        <Delimiters>.;-</Delimiters>
        <DelimitersArray>$(Delimiters.Split(`;`))</DelimitersArray>
    </PropertyGroup>
    <ItemGroup>
        <SplitVersion Include="$(MasterVersion.Split($(DelimitersArray)))" />
    </ItemGroup>
    <Target Name="Test">
        <Message Importance="high" Text="@(SplitVersion)"/>
    </Target>
</Project>
<PropertyGroup>
  <SplitVersion0>$(MasterVersion.Split($(DelimitersArray))[0])</SplitVersion0>
  <SplitVersion1>$(MasterVersion.Split($(DelimitersArray))[1])</SplitVersion1>
  <SplitVersion2>$(MasterVersion.Split($(DelimitersArray))[2])</SplitVersion2>
</PropertyGroup>