代码之家  ›  专栏  ›  技术社区  ›  evilhomer

MSBuild ReadLinesFromFile一行中的所有文本

  •  13
  • evilhomer  · 技术社区  · 18 年前

    <Project DefaultTargets = "Deploy"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
    <Import  Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
    
    <ItemGroup>
        <MyTextFile Include="$(ReleaseNotesDir)$(NewBuildNumber).txt"/>
    </ItemGroup>
    
    <Target Name="ReadReleaseNotes">
        <ReadLinesFromFile
            File="@(MyTextFile)" >
            <Output
                TaskParameter="Lines"
                ItemName="ReleaseNoteItems"/>
        </ReadLinesFromFile>
    </Target>
    
    <Target Name="MailUsers" DependsOnTargets="ReadReleaseNotes" >
        <Mail SmtpServer="$(MailServer)"
            To="$(MyEMail)"
            From="$(MyEMail)"
            Subject="Test Mail Task"
            Body="@(ReleaseNoteItems)" />
    </Target>
    <Target Name="Deploy">
        <CallTarget Targets="MailUsers" />
    </Target>
    
    </Project>
    

    - New Deployment Tool for BLAH
    
    - Random other stuff()""
    

    像这样出来

    - New Deployment Tool for BLAH;- Random other stuff()""
    

    我知道ReadLinesFromFile的代码将一次提取一行中的数据,并去掉回车符。

    有没有办法把它们放回去? 我的电子邮件看起来格式都很好?

    谢谢

    4 回复  |  直到 18 年前
        1
  •  44
  •   casperOne    12 年前

    这里的问题是您正在使用 ReadLinesFromFile


    读了一份 从文本文件。

    因此,它不仅仅是从一个文件中读取所有文本,它还从一个文件中读取单个项目并返回一组ITASKITEM。无论何时使用 @() 语法您将得到一个单独的列表,默认为分号。此示例说明了此行为:

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Build"    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    
        <ItemGroup>
            <Color Include="Red" />
            <Color Include="Blue" />
            <Color Include="Green" />
    </ItemGroup>
    
    <Target Name="Build">
            <Message Text="ItemGroup Color: @(Color)" />
    </Target>
    
    </Project>
    

    输出如下所示:

      ItemGroup Color: Red;Blue;Green
    

    因此,虽然问题的最佳解决方案是编写一个MSBuild任务,将文件读入 所有物 作为一个字符串,而不是一个项目列表,这并不是你想要的。你问我有没有 要把它们放回去,就有人在用 MSBuild Transforms .

    ReadItemsFromFile 进入另一个带有换行符的列表。下面是一个例子:

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
    
        <ItemGroup>
            <File Include="$(MSBuildProjectDirectory)\Test.txt" />
        </ItemGroup>
    
        <Target Name="Build">
            <ReadLinesFromFile File="@(File)">
                <Output TaskParameter="Lines" ItemName="FileContents" />
            </ReadLinesFromFile>
    
            <Message Text="FileContents: @(FileContents)" />
            <Message Text="FileContents Transformed: @(FileContents->'%(Identity)', '%0a%0d')" />
        </Target>
    
    </Project>
    

    Test.text看起来像:

    Red
    Green
    Blue
    

    输出如下所示:

    [C:\temp]:: msbuild test.proj
    Microsoft (R) Build Engine Version 3.5.21022.8
    [Microsoft .NET Framework, Version 2.0.50727.1433]
    Copyright (C) Microsoft Corporation 2007. All rights reserved.
    
    Build started 11/8/2008 8:16:59 AM.
    Project "C:\temp\test.proj" on node 0 (default targets).
      FileContents: Red;Green;Blue
      FileContents Transformed: Red
    Green
    Blue
    Done Building Project "C:\temp\test.proj" (default targets).
    
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time Elapsed 00:00:00.03
    

    @(FileContents->'%(Identity)', '%0a%0d')   
    
    • 我们正在使用相同的值将列表从一种类型转换为另一种类型( Identity '%0a%0d'
    • 我们正在使用 MSBuild Escaping 为了避开换行( %0a )和马车返回( %0d
        2
  •  42
  •   user75810    14 年前

    如果使用的是MSBuild 4.0,则可以执行以下操作来获取文件的内容:

    $([System.IO.File]::ReadAllText($FilePath))
    
        3
  •  4
  •   dan moseley dan moseley    17 年前

    我相信您可以使用@(文件内容->'(标识)'%0a%0d')而不是@(文件内容,%0a%0d'))

        4
  •  1
  •   Haytem BrB    10 年前

    您可以将WriteListFile与

    $([System.IO.File]::ReadAllText($(SourceFilePath))):
    
    < WriteLinesToFile File="$(DestinationFilePath)"  Lines="$([System.IO.File]::ReadAllText($(SourceFilePath)))"
                          Overwrite="true" 
                          />
    

    这将准确地复制您的文件。

    推荐文章