当我在MSBUILD中的文件上执行ReadLinesFromFile并再次输出该文件时,我将所有文本放在一行上.所有Carriage返回和LineFeeds都被删除.
我从文件中得到通常看起来像这样的文本
- New Deployment Tool for BLAH - Random other stuff()""
像这样出来
- New Deployment Tool for BLAH;- Random other stuff()""
我知道ReadLinesFromFile的代码将一次拉取一行数据并去除回车.
有没有办法把它们放回去?所以我的电子邮件看起来格式很好?
谢谢
这里的问题是你ReadLinesFromFile
以一种不打算的方式使用任务.
ReadLinesFromFile任务从文本文件中
读取项目列表.
因此,它不只是从文件中读取所有文本,而是从文件中读取单个项目并返回ITaskItems的项目组.每当使用@()
语法输出项目列表时,您将获得一个单独的列表,默认值为分号.此示例说明了此行为:
输出看起来像这样:
ItemGroup Color: Red;Blue;Green
因此,尽管您的问题的最佳解决方案是编写一个MSBuild任务,将文件作为字符串读入属性而不是项目列表,这实际上不是您要求的.你问是否有办法将它们放回去,并且使用了MSBuild Transforms.
转换用于从另一个列表创建一个列表,并且还可以使用自定义分隔符进行转换.所以答案是将使用的ReadItemsFromFile
列表转换为另一个带换行符的列表.这是一个例子:
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
)
如果您使用的是MSBuild 4.0,则可以执行以下操作来获取文件的内容:
$([System.IO.File]::ReadAllText($FilePath))