如何在“执行”中执行EXEC任务;“循环”;是否使用MSBuild项组?

如何在“执行”中执行EXEC任务;“循环”;是否使用MSBuild项组?,msbuild,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="fa

如何使用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>
    <CachedTables Include="account" />
    <CachedTables Include="services" />
    <CachedTables Include="servicesGroup" />
    <CachedTables Include="servicesCategory" />


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

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

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

<Target Name="ExecMany"
  Outputs="%(CachedTables.Identity)">
  <Exec
    Command="sqlcmd -S ... TableName=%22%(CachedTables.Identity)%22 -i ..."
    />
  <SomeOtherTask ThatUses="%(CachedTables.Identity)" />
</Target>
第二个选项分别对每个任务进行批处理,将产生以下顺序:

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

如果我理解这个问题,可以做得简单一点。以下示例使用

  <ItemGroup>
    <MySpecialItem Include="one" />
    <MySpecialItem Include="two" />
    <MySpecialItem Include="three" />
  </ItemGroup>    

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


以下是相关的MSDN链接,我是在阅读了Brian的答案后才找到的:,并且。我对此的答案已被删除,但是我想记录在案的是,我写这个问题以来的经历让我强烈地感觉到这是个坏主意:你应该使用Psake或gulp这样的工具来做这样的事情。如果你不知道MySpecialItem是什么,例如,MySpecialItem将是一个多行变量的内容,你会怎么做
Exec with "account"
Exec with "services"
...
SomeOtherTask with "account"
SomeOtherTask with "services"
...
  <ItemGroup>
    <MySpecialItem Include="one" />
    <MySpecialItem Include="two" />
    <MySpecialItem Include="three" />
  </ItemGroup>    

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