MSBUILD:ReadLinesFromFile不读取重复的行

时间:2011-07-07 07:43:52

标签: visual-studio-2010 sql-server-2005 msbuild build-automation msbuild-task

我正在使用MSBuild读取我的数据库项目所依赖的所有SQL后部署文件,并将此数据写入一个已加载的主脚本。

我得到了所有需要的文件:

<ReadLinesFromFile File="$(ScriptsList)" >
  <Output TaskParameter="Lines" ItemName="IncludedFiles"/>
</ReadLinesFromFile>

然后我批处理它们(逐行读取所有文件到ListedData)

<ReadLinesFromFile File='$(ScriptDirectory)$([System.String]::Copy("%(IncludedFiles.Identity))' Condition="$([System.String]::Copy('%(IncludedFiles.Identity)').Substring(0,2))==':r'">
  <Output TaskParameter="Lines" ItemName="ListedData"/>
</ReadLinesFromFile>

找到所有文件没有问题,然后我将其写入output.sql。 但是该文件缺少几行,这使得sqlcmd无法解析output.sql。

来源:

INSERT INTO [Characteristics] (

 [CharacteristicID], 
 [CharName], 
 [RuleName], 
 [ActionRuleName], 
 [CriteriaSetID], 
 [ActionCriteriaSetID], 
 [ListCodeID], 
 [LocalID], 
 [BomCategory]

)

SELECT ...something,something... from Characteristics

INSERT INTO [CharacteristicDomain] (

 [RuleSet], 
 [CharName], 
 [CharSlot], 
 [Description], 
 [Seq], 
 [ValueInteger], 
 [ValueFloat], 
 [ValueDate], 
 [ValueString]

)

SELECT ...something,something... from CharacteristicsDomain

如您所见,将有几行带有单个')'括号,任务只读取第一行,然后忽略所有重复项(因为它是一个项目组,而不是列表)。所以实际上我得到一个看起来像这样的文件:

输出:

INSERT INTO [Characteristics] (
 [CharacteristicID], 
 [CharName], 
 [RuleName], 
 [ActionRuleName], 
 [CriteriaSetID], 
 [ActionCriteriaSetID], 
 [ListCodeID], 
 [LocalID], 
 [BomCategory]
)
SELECT ...something,something... from Characteristics
INSERT INTO [CharacteristicDomain] (
 [RuleSet], 
 [CharName], 
 [CharSlot], 
 [Description], 
 [Seq], 
 [ValueInteger], 
 [ValueFloat], 
 [ValueDate], 
 [ValueString]
SELECT ...something,something... from CharacteristicsDomain

有人知道使用MSBuild从文件中读取行的方法,但不会丢失重复的行吗? 我想也许有一些方法可以使用Exec任务?我当然不能写自己的任务,我也不允许修改sql文件(我不能依赖用户,他们会按照我需要的方式格式化文件)。我需要用MSBuild读取文件,因为在将它们推送到sqlcmd之前我修改了一些文件。

2 个答案:

答案 0 :(得分:1)

你是如何写入output.sql的?如果您正在批量处理%(ListedData.Identity),那么这将只为您提供唯一的行。将它用作@(ListedData),它应该没问题。

答案 1 :(得分:1)

你的第二个ReadLinesFromFile,创建@(ListedData)的那个是错误的。它使用%(IncludedFiles.Identity)进行任务批处理,因此带有“)”的两行都将被放入一个批处理中。