2014-01-30 88 views
2

我困在MSBuild中的以下問題。 我有包含列表(逐行)與我需要建立用逗號分隔的所有解決方案和相關的開發人員的電子郵件文本文件(buildsolutions1.txt):閱讀文本文件並在MSBuild中拆分每行

COMMON \ Common.sln,我@電子郵件,電子郵件:com
ExcGw/ExcDataService.sln,pm @ email.com; am @ email,com; [email protected]; [email protected]; [email protected]
MessB/MessB/Message.sln,am @電子郵件,com RiskS/RiskS2.sln,jp @ email.com; [email protected]; [email protected]; [email protected]; [email protected]

我需要讀取此文件行逐行編譯每個解決方案,以防萬一失敗 - 向相關開發人員發送電子郵件

我的想法是創建一個項目組每行是從這個文件中的一行,它有2個元數據值: 解決方案 - 行的第一部分,直到逗號 電子郵件 - 從逗號到行的第二部分行尾

因此,我創建了一個PropertyGroup和一個目標ReadSolutions,如下所示。

我逐行讀取文件中的行,但我不知道如何設置的元數據每個行項目:
FirstPartOfTheCurrentLine(%(LinesFromFile.Identity))
SecondPartOfTheCurrentLine(%(LinesFromFile.Identity))

此語法不起作用:
%(LinesFromFile.Identity.Split( ' ')[0])
%(LinesFromFile.Identity.Split(',')[1])

也許有人會k現在如何正確設置元數據或者可能有另一種方法來完成這項任務。 感謝

下面是代碼:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="4.0" DefaultTargets="CoreBuild"> 

    <PropertyGroup> 
    <TPath>$(MSBuildProjectDirectory)\..\tools\MSBuild Extension Pack Binaries\MSBuild.ExtensionPack.tasks</TPath> 
    </PropertyGroup> 
    <Import Project="$(TPath)"/> 

<PropertyGroup> 
    <!-- Default working folder --> 
    <RootFolder Condition=" '$(RootFolder)' == '' " >c:\ff\</RootFolder> 
    <BuildSolutionsFile >buildsolutions1.txt</BuildSolutionsFile> 
    <BuildSolutionsFileFullPath >$(RootFolder)$(BuildSolutionsFile)</BuildSolutionsFileFullPath> 
</PropertyGroup> 


<Target Name="ReadSolutions"> 
    <Message Text=" Build solutions text file is : $(BuildSolutionsFileFullPath)" /> 

    <!—Read the file and store each line as an item into LinesFromFile item group--> 
    <ReadLinesFromFile 
    File="$(BuildSolutionsFileFullPath)" > 
    <Output 
     TaskParameter="Lines" 
     ItemName="LinesFromFile"/> 
    </ReadLinesFromFile> 

    <Message Text="Current line : %(LinesFromFile.Identity)" /> 
    <Message Text="===================================" /> 

    <!—Create the other item group where each item is a line and has the metadata Solution and Emails --> 

    <ItemGroup> 
    <Lines Include="%(LinesFromFile.Identity)" > 
     <Solution>FirstPartOfTheCurrentLine(%(LinesFromFile.Identity))</Solution> 
     <Emails>SecondPartOfTheCurrentLine(%(LinesFromFile.Identity)) </Emails> 

    </Lines> 

    </ItemGroup> 


    <Message Text="All the Lines :%[email protected](Lines,'%0A')" /> 



</Target> 

回答

6

這是我處理的數據:

Common\Common.sln,[email protected],com 
ExcGw/ExcDataService.sln,[email protected];[email protected],com;[email protected];[email protected];[email protected] 
MessB/MessB/Message.sln,[email protected]il,com 
RiskS/RiskS2.sln,[email protected];[email protected];[email protected];[email protected];[email protected] 

稍加修改你的樣品,包括第四解換行符。

下面是修改代碼:

<ItemGroup> 
    <Lines Include="@(LinesFromFile)" > 
     <Solution>$([System.String]::Copy('%(LinesFromFile.Identity)').Split(',')[0])</Solution> 
     <Emails>$([System.String]::Copy('%(LinesFromFile.Identity)').Split(',')[1])</Emails> 
    </Lines> 
</ItemGroup> 
<Message Text="Solutions to Emails-> %(Lines.Solution) -> %(Lines.Emails)" /> 

我們的值複製到一個屬性,所以我們可以使用屬性的功能分裂的價值,得到我們需要的部分。

這裏是輸出:

Solutions to Emails-> Common\Common.sln -> [email protected] 
Solutions to Emails-> ExcGw/ExcDataService.sln -> [email protected];[email protected] 
Solutions to Emails-> MessB/MessB/Message.sln -> [email protected] 
Solutions to Emails-> RiskS/RiskS2.sln -> [email protected];[email protected];[email protected];[email protected];[email protected] 
+0

你是一個生命的救星,非常感謝!我也不會在一年:-)想通了這樣所以,關鍵是要複製。項目值轉換成屬性,然後分割它。 – Teognost

+0

是的。我試圖使用子字符串,但你也必須嵌套上述調用來設置索引,這是很難讀的:) – Nicodemeus