代码之家  ›  专栏  ›  技术社区  ›  Scott Langham

如果没有项目,如何停止项目批处理以执行批处理?

  •  14
  • Scott Langham  · 技术社区  · 15 年前

    使用msbuild执行此操作:

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <ItemGroup>
        <Colors Include="Blue">
          <Shade>Dark</Shade>
        </Colors>
      </ItemGroup>
    
      <Target Name="Main">
        <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
      </Target>
    
    </Project>
    

    它输出:

    Color: Dark Blue
    

    很好,很好,但是删除颜色并使用:

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <ItemGroup>
      </ItemGroup>
    
      <Target Name="Main">
        <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
      </Target>
    
    </Project>
    

    它输出:

    Color:
    

    当组中没有项目时,为什么要执行一批消息任务?我本来以为是零项的,批处理将执行零次,我看不到“color:”后面的输出中没有任何内容。

    我是在做错事还是有解决办法?

    谢谢。


    更新: 我发现你可以做到:

    <Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
    

    但是,如果每次使用批处理时都没有项目,那么就必须为案例显式地编写代码,这让人感到不满意。

    2 回复  |  直到 13 年前
        1
  •  11
  •   Benjamin Baumann    15 年前

    我的2分:

    在消息任务中,有来自批处理和静态信息(“颜色:”)的信息。我认为msbuild会打印静态信息,然后对colors项的值进行批处理。问题是您的集合中没有任何数据(甚至没有声明),我想msbuild会将其解释为空列表,当您尝试打印它时,会打印空字符串“”。

    如果删除静态内容(“颜色:”和标识前的空白),则不会显示任何内容。

    仅当items集合不为空时才使用批处理进行打印的解决方案为:

    1. 检查集合是否为空

      <Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
      
    2. 使用转换[1]

      <Message Text="@(Colors->'Color : %(Shade) %(Identity)')"/>
      

    〔1〕 http://msdn.microsoft.com/en-us/library/ms171476.aspx

        2
  •  5
  •   No Spoon    13 年前

    只是想为这个添加一个替代的解决方案。如果可以将批处理更改为目标批处理,而不是任务批处理,则可以将条件语句添加到目标。

    我在这里添加了目标批处理:

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <ItemGroup>
      </ItemGroup>
    
      <Target Name="Main" Outputs="%(Colors.Identity)">
        <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
      </Target>
    
    </Project>
    

    …并且可以有条件地使其仅在“颜色”项组中存在某些内容时执行:

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <ItemGroup>
      </ItemGroup>
    
      <Target Condition="'@(Colors)'!=''" Name="Main" Outputs="%(Colors.Identity)">
        <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
      </Target>
    
    </Project>