如何在MSBuild任务中将行插入文件?

时间:2014-01-31 23:23:38

标签: msbuild

我正在尝试将一些文字插入到文本第二行的文件中。我目前已经使用ReadLinesFromFile将文本插入顶部。有没有办法打破我从那里回来的列表2件,所以我可以在第二行插入?

我现在拥有的:

<Target>
  <ReadLinesFromFile File="targetfile.txt">
    <Output TaskParameter="Lines" ItemName="TargetFileContents"/>
  </ReadLinesFromFile>

  <WriteLinesToFile File="targetfile.txt" Lines="$(TextToInsert)" Overwrite="true"/>
  <WriteLinesToFile File="targetfile.txt" Lines="@(TargetFileContents)" Overwrite="false"/>
</Target>  

1 个答案:

答案 0 :(得分:4)

这是一个带有所有脚手架的大锤,但您可以将任务写入项目文件(或包含文件,通常具有.targets扩展名):

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTarget="InsertLine">   
    <Target Name="InsertLine">
        <InsertIntoFile FilePath="test.txt" LineNumber="999" Text="Test complete" />
        <InsertIntoFile FilePath="test.txt" LineNumber="1" Text="2" />
        <InsertIntoFile FilePath="test.txt" LineNumber="2" Text="3" />
        <InsertIntoFile FilePath="test.txt" LineNumber="1" Text="1" />
        <InsertIntoFile FilePath="test.txt" LineNumber="1" Text="Testing the 2MC" />
    </Target>
    <UsingTask
      TaskName="InsertIntoFile"
      TaskFactory="CodeTaskFactory"
      AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
        <ParameterGroup>
            <FilePath ParameterType="System.String" Required="true" />
            <LineNumber ParameterType="System.Int32"  Required="true" />
            <Text ParameterType="System.String" Required="true" />
        </ParameterGroup>
        <Task>
          <Using Namespace="System" />
          <Using Namespace="System.IO" />
          <Code Type="Fragment" Language="cs">
              <![CDATA[
                // By tradition, text file line numbering is 1-based
                var lines = File.Exists(FilePath) 
                                      ? File.ReadAllLines(FilePath).ToList() 
                                      : new List<String>(1);
                lines.Insert(Math.Min(LineNumber - 1, lines.Count), Text);
                File.WriteAllLines(FilePath, lines);
                return true;
              ]]>
            </Code>
        </Task>
    </UsingTask>
</Project>