17

MSBUILD でファイルに対して ReadLinesFromFile を実行し、そのファイルを再度出力すると、すべてのテキストが 1 行に表示されます。すべてのキャリッジ リターンと LineFeeds が取り除かれます。

<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 のコードは、一度に 1 行ずつデータを取得し、キャリッジ リターンを取り除きます。

それらを元に戻す方法はありますか?私の電子メールはすべてき​​れいにフォーマットされているように見えますか?

ありがとう

4

4 に答える 4

44

ここでの問題は、ReadLinesFromFile意図しない方法でタスクを使用していることです。

ReadLinesFromFile タスクテキスト ファイルからアイテム
のリストを読み取ります。

したがって、ファイルからすべてのテキストを読み取るだけでなく、ファイルから個々の項目を読み取り、ITaskItems の項目グループを返します。構文を使用してアイテムのリストを出力するときはいつでも@()、区切りリストを取得します。デフォルトはセミコロンです。次の例は、この動作を示しています。

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

ここで起こっていることは 2 つあります。

@(FileContents->'%(Identity)', '%0a%0d')   
  • 同じ値 ( ) を使用してリストをあるタイプから別のタイプに変換していますIdentityが、カスタム セパレーターを使用しています。'%0a%0d'
  • ライン フィード ( ) とキャリッジ リターン ( )をエスケープするためにMSBuild エスケープを使用しています。%0a%0d
于 2008-11-08T13:32:22.207 に答える
42

MSBuild 4.0 を使用している場合は、代わりに次のようにしてファイルの内容を取得できます。

$([System.IO.File]::ReadAllText($FilePath))
于 2012-02-17T20:41:51.170 に答える
4

@(FileContents->'%(Identity)', '%0a%0d') の代わりに @(FileContents, '%0a%0d') を実行できると思います

于 2009-09-12T09:39:42.950 に答える
1

と組み合わせて WriteLinesToFile を使用できます

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

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

これにより、ファイルがそのままコピーされます。

于 2016-02-02T14:59:53.613 に答える