2011-05-17 77 views
37

如何在MSBuild ItemGroups的「循環」中執行EXEC任務?如何在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

我的答案,這已被刪除,但我想說明的記錄,我的體驗,因爲寫這個問題讓我非常強烈地感覺到這是一個糟糕的主意:你應該使用像Psake或gulp這樣的工具來做這樣的事情。 – 2015-06-09 14:37:58

回答

45

有兩種方法可以做到這一點,無論是「配料」

您可以批量的目標和執行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" 
... 
+2

下面是相關的MSDN鏈接,我只能在閱讀Brian的答案後才能找到:[MSBuild batching](http://msdn.microsoft.com/zh-cn/library/ms171473.aspx),[transforms]( http://msdn.microsoft.com/en-us/library/ms171476.aspx)和[項目元數據](http://msdn.microsoft.com/en-us/library/ms171474.aspx)。 – 2012-02-10 20:21:19

26

如果我理解這個問題,這是可以做到一點更簡單。下面的示例使用< Exec的/>每個項目在回聲出一個<的ItemGroup />

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

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

當你不知道MySpecialItem是什麼時,你會怎麼做,例如,MySPecialItem是多行變量的內容 – 2016-07-19 00:25:54