从MSBuild属性分析键/值对

从MSBuild属性分析键/值对,msbuild,Msbuild,假设我有一个类似于: <MyProp>Foo=Bar;Hello=World</MyProp> 编辑:要明确的是,属性不是我自己创建的,它是来自另一个目标的输出,超出了我的控制范围,因此我无法更改属性声明的方式。就我而言,您有两种方法要遵循 声明一个类似于以下内容的 酒吧 世界 然后使用以下方法访问您的属性 或者您可能希望采取如下方法 <ItemGroup> <MySolutionFiles Include="..\mySolution

假设我有一个类似于:

<MyProp>Foo=Bar;Hello=World</MyProp>

编辑:要明确的是,属性不是我自己创建的,它是来自另一个目标的输出,超出了我的控制范围,因此我无法更改属性声明的方式。

就我而言,您有两种方法要遵循

  • 声明一个类似于以下内容的
  • 
    酒吧
    世界
    
    然后使用以下方法访问您的属性

    
    
    或者您可能希望采取如下方法

    <ItemGroup>
        <MySolutionFiles Include="..\mySolution.sln" />
    </ItemGroup>
    <Target Name="PrintItems">
         <Message Text="My Files: @(MySolutionFiles)" />
    </Target>
    
    
    
    您还可以拥有以下内容

    
    
    如果对输入没有选择,那么一种可能的解决方案是将输入解析到数组中,然后从数组中获取输入,如下所示:

    
    Foo=Bar;你好=世界
    $(MyProp.Split(';'))
    
    然后使用如下数组项:

    
    

    拆分[0]项包含Foo=Bar,可以像上面一样拆分为两个以上的字符串。就我而言,你有两条路要走

  • 声明一个类似于以下内容的
  • 
    酒吧
    世界
    
    然后使用以下方法访问您的属性

    
    
    或者您可能希望采取如下方法

    <ItemGroup>
        <MySolutionFiles Include="..\mySolution.sln" />
    </ItemGroup>
    <Target Name="PrintItems">
         <Message Text="My Files: @(MySolutionFiles)" />
    </Target>
    
    
    
    您还可以拥有以下内容

    
    
    如果对输入没有选择,那么一种可能的解决方案是将输入解析到数组中,然后从数组中获取输入,如下所示:

    
    Foo=Bar;你好=世界
    $(MyProp.Split(';'))
    
    然后使用如下数组项:

    
    

    拆分[0]项包含Foo=Bar,可以像上面一样拆分为两个以上的字符串。就我而言,你有两条路要走

  • 声明一个类似于以下内容的
  • 
    酒吧
    世界
    
    然后使用以下方法访问您的属性

    
    
    或者您可能希望采取如下方法

    <ItemGroup>
        <MySolutionFiles Include="..\mySolution.sln" />
    </ItemGroup>
    <Target Name="PrintItems">
         <Message Text="My Files: @(MySolutionFiles)" />
    </Target>
    
    
    
    您还可以拥有以下内容

    
    
    如果对输入没有选择,那么一种可能的解决方案是将输入解析到数组中,然后从数组中获取输入,如下所示:

    
    Foo=Bar;你好=世界
    $(MyProp.Split(';'))
    
    然后使用如下数组项:

    
    

    拆分[0]项包含Foo=Bar,可以像上面一样拆分为两个以上的字符串。就我而言,你有两条路要走

  • 声明一个类似于以下内容的
  • 
    酒吧
    世界
    
    然后使用以下方法访问您的属性

    
    
    或者您可能希望采取如下方法

    <ItemGroup>
        <MySolutionFiles Include="..\mySolution.sln" />
    </ItemGroup>
    <Target Name="PrintItems">
         <Message Text="My Files: @(MySolutionFiles)" />
    </Target>
    
    
    
    您还可以拥有以下内容

    
    
    如果对输入没有选择,那么一种可能的解决方案是将输入解析到数组中,然后从数组中获取输入,如下所示:

    
    Foo=Bar;你好=世界
    $(MyProp.Split(';'))
    
    然后使用如下数组项:

    
    

    拆分[0]项包含Foo=Bar,可以像上面一样拆分为两个以上的字符串。这应该可以让您暂时保持下去。

    您不需要属性组,最好有默认值,以防用户不传递它们

    对于您传递的每个属性,访问该属性的语法为$(PropertyName)

    因此,如果你通过:

    msbuild.exe/p:P1=V1/p:P2=V2;P3=V3

    您将使用属性名$(P1),$(P2),$(P3)


    有关MsBuild属性的详细信息。

    您不需要属性组,最好有默认值,以防用户不传递它们

    对于您传递的每个属性,访问该属性的语法为$(PropertyName)

    因此,如果你通过:

    msbuild.exe/p:P1=V1/p:P2=V2;P3=V3

    您将使用属性名$(P1),$(P2),$(P3)


    有关MsBuild属性的详细信息。

    您不需要属性组,最好有默认值,以防用户不传递它们

    对于您传递的每个属性,访问该属性的语法为$(PropertyName)

    因此,如果你通过:

    msbuild.exe/p:P1=V1/p:P2=V2;P3=V3

    您将使用属性名$(P1),$(P2),$(P3)


    有关MsBuild属性的详细信息。

    您不需要属性组,最好有默认值,以防用户不传递它们

    对于您传递的每个属性,访问该属性的语法为$(PropertyName)

    因此,如果你通过:

    msbuild.exe/p:P1=V1/p:P2=V2;P3=V3

    您将使用属性名$(P1),$(P2),$(P3)

    有关MsBuild属性的详细信息。

    
    Foo=Bar;你好=世界
    
    
    Foo=Bar;你好=世界
    
    
    Foo=Bar;你好=世界
    
    
    Foo=Bar;你好=世界
    
    查看我的编辑,我没有选择更改属性的声明方式。查看我的编辑,我没有选择更改属性的声明方式。查看我的编辑,我没有选择更改属性的声明方式。查看我的编辑,我没有更改属性声明方式的选择。请参阅我编辑的响应。如果找不到具体解决方案,则可以使用第三种方法。请参阅我编辑的响应。如果找不到具体解决方案,则可以使用第三种方法。请参阅我编辑的响应。Yo
    <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>
    
    <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>