如何在MSBuild ItemGroups的“循环”中执行EXEC任务?

时间:2011-05-17 20:32:26

标签: msbuild

如何在MSBuild ItemGroups的“循环”中执行EXEC任务?

不是一遍又一遍地重复这个命令,而是这样:

    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22account%22 -i data\add_sql_cache.sql -b" />
    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22services%22 -i data\add_sql_cache.sql -b" />
    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22servicesGroup%22 -i data\add_sql_cache.sql -b" />
    <Exec ContinueOnError="false" Command="sqlcmd -S $(ServerName) $(SqlServerUser) -d $(DbName) -v TableName=%22servicesCategory%22 -i data\add_sql_cache.sql -b" />

我宁愿定义一个ItemGroup而只是执行一个“循环”。我把ItemGroup放下了:

<ItemGroup>
    <CachedTables Include="account" />
    <CachedTables Include="services" />
    <CachedTables Include="servicesGroup" />
    <CachedTables Include="servicesCategory" />

但由于MSBuild的语法非常不直观,我不知道如何在上面的ItemGroup作为输入的循环中执行Exec任务。

2 个答案:

答案 0 :(得分:49)

有两种方法可以做到这一点,两种方式都是“批量”的形式

您可以批量处理目标并执行Exec和其他操作,

<Target Name="ExecMany"
  Outputs="%(CachedTables.Identity)">
  <Exec
    Command="sqlcmd -S ... TableName=%22%(CachedTables.Identity)%22 -i ..."
    />
  <SomeOtherTask ThatUses="%(CachedTables.Identity)" />
</Target>

另一种是在Exec任务上使用任务批处理。它很相似,

<Target Name="ExecMany">
  <Exec
    Command="sqlcmd -S ... TableName=%22%(CachedTables.Identity)%22 -i ..."
    />
  <SomeOtherTask ThatUses="%(CachedTables.Identity)" />
</Target>

不同之处在于它们的运作方式。对于第一个,因为批处理是针对整个目标(使用Outputs属性实现),Exec任务,然后SomeOtherTask将对组中的每个项执行。换句话说,

Exec with "account"
SomeOtherTask with "account"
Exec with "services"
SomeOtherTask with "services"
...

第二个选项,分别对每个任务进行批处理,将生成以下序列,

Exec with "account"
Exec with "services"
...
SomeOtherTask with "account"
SomeOtherTask with "services"
...

答案 1 :(得分:32)

如果我理解这个问题,可以更简单地完成。以下示例使用&lt; Exec /&gt; 来回显&lt; ItemGroup /&gt;

中的每个项目
  <ItemGroup>
    <MySpecialItem Include="one" />
    <MySpecialItem Include="two" />
    <MySpecialItem Include="three" />
  </ItemGroup>    

  <Target Name="MyTarget">
    <Exec Command="echo %(MySpecialItem.Identity)"/>
  </Target>