MSBuild ReadLinesFromFile tout le texte sur une ligne

quand je fais un ReadLinesFromFile sur un fichier dans MSBUILD et que je sors ce fichier à nouveau, je reçois tout le texte sur une ligne. Tous les retours de chariot et les gains de ligne sont retirés.

<Project DefaultTargets = "Deploy"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<Import  Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.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>

je reçois le texte du fichier qui ressemble normalement à ceci

- New Deployment Tool for BLAH

- Random other stuff()""

Coming out " comme ça

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

je sais que le code pour ReadLinesFromFile tirez les données dans une ligne à la fois et d'en extraire les retours chariot.

Est-il un moyen de les mettre en? Donc mon e-mail est joliment formaté?

Merci

13
demandé sur evilhomer 2008-11-07 18:54:00

4 réponses

le problème ici est que vous utilisez la tâche ReadLinesFromFile d'une manière qui n'était pas prévue.

ReadLinesFromFile Task

Lit une liste de éléments à partir d'un fichier texte.

donc il ne s'agit pas seulement de lire tout le texte d'un fichier, il s'agit de lire des éléments individuels à partir d'un fichier et de retourner un groupe d'itaskitems. Chaque fois que vous sortie d'une liste d'articles en utilisant la syntaxe @() vous obtiendrez une liste séparée, dont la valeur par défaut est un point-virgule. Cet exemple illustre ce comportement:

<?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>

Et la sortie ressemble à ceci:

  ItemGroup Color: Red;Blue;Green

alors bien que la meilleure solution à votre problème est d'écrire une tâche MSBuild qui lit un fichier dans un propriété comme une chaîne de caractères et pas une liste d'Articles, ce n'est vraiment pas ce que vous avez demandé. Vous demandé s'il y avait un chemin pour les remettre, et il y a l'utilisation MSBuild transforme .

Les transformes

sont utilisées pour créer une liste à partir d'une autre et ont également la capacité de transformer à l'aide d'un séparateur personnalisé. La réponse est donc de transformer votre liste lue en utilisant ReadItemsFromFile en une autre liste avec newlines. Voici un exemple qui fait justement cela:

<?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.texte ressemble:

Red
Green
Blue

Et la sortie ressemble à ceci:

[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

ce qui se passe ici est deux choses.

@(FileContents->'%(Identity)', '%0a%0d')   
  • nous sommes en train de transformer la liste d'un type à un autre en utilisant les mêmes valeurs ( Identity ) mais un séparateur personnalisé '%0a%0d'
  • Nous sommes à l'aide de MSBuild s'Échapper du pour échapper à la ligne d'alimentation ( %0a ) et un retour chariot ( %0d )
40
répondu Todd 2014-01-21 14:19:38

si vous utilisez MSBuild 4.0, vous pouvez faire ce qui suit à la place, pour obtenir le contenu d'un fichier:

$([System.IO.File]::ReadAllText($FilePath))
34
répondu user75810 2012-02-17 20:41:51

au lieu de @(FileContents - > ' %(Identity)', '%0a%0d') je crois que vous pouvez faire @(FileContents, '%0a%0d')

3
répondu 2009-09-12 09:39:42

vous pouvez utiliser WriteLinesToFile combiné avec

$([System.IO.File]::ReadAllText($(SourceFilePath))):

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

cela copiera votre fichier exactement à ce qu'il est.

1
répondu romi ares 2016-02-02 15:37:17