如何在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任务。
答案 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>