You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MSBuild读取含换行符的文本文件并生成对应版本属性

解决MSBuild读取换行文本并生成指定属性组的问题

需求说明

  • 读取包含换行的文本文件,文件内容如下:
Prod;2.13
Pre-Prod;2.14
Test;2.15
  • 期望生成如下属性组:
<PropertyGroup>
    <_ProdVersion>2.13</_ProdVersion>
    <_PreProdVersion>2.14</_PreProdVersion>
    <_TestVersion>2.15</_TestVersion>
</PropertyGroup>
  • 现有代码已使用ReadLinesFromFile读取文件,但无法正确拆分每行并生成对应属性,现有代码:
<ReadLinesFromFile Condition="'$(Configuration)' == 'Debug'" File="$(MSBuildThisFileDirectory)/Resources/Others/MyFiles.txt">
    <Output TaskParameter="Lines" ItemName="MyItem" />
</ReadLinesFromFile>
<ItemGroup>
    <Lines Include="@(MyItem)">
        <Line_test>$([System.String]::Copy('%(MyItem.Identity)'))</Line_test>
    </Lines>
</ItemGroup>
<PropertyGroup>
    <_test>%(Lines.Line_test)</_test>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">           
    <_TestLine1>$(_test.Split(';')[0])</_TestLine1>
    <_TestLine2>$(_test.Split(';')[1])</_TestLine2>         
</PropertyGroup>

解决方案

ReadLinesFromFile任务已经自动按换行拆分每行到项集中,问题在于你直接取%(Lines.Line_test)只会获取最后一行的值,无法遍历所有行生成属性。以下是完整实现:

完整代码

<ReadLinesFromFile Condition="'$(Configuration)' == 'Debug'" File="$(MSBuildThisFileDirectory)/Resources/Others/MyFiles.txt">
    <Output TaskParameter="Lines" ItemName="VersionLines" />
</ReadLinesFromFile>

<!-- 为每行拆分环境名和版本号,生成元数据 -->
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
    <VersionLines>
        <!-- 拆分环境名:截取;前的内容,替换-为空以匹配属性命名 -->
        <EnvName>$([System.String]::Copy('%(Identity)').Split(';')[0].Replace('-', ''))</EnvName>
        <!-- 拆分版本号:截取;后的内容 -->
        <Version>$([System.String]::Copy('%(Identity)').Split(';')[1])</Version>
    </VersionLines>
</ItemGroup>

<!-- 遍历项集,动态生成目标属性 -->
<CreateProperty Condition="'$(Configuration)' == 'Debug' and '%(VersionLines.Identity)' != ''"
                Value="%(VersionLines.Version)"
                PropertyName="_%(VersionLines.EnvName)Version">
    <Output TaskParameter="PropertyName" PropertyName="GeneratedPropertyName" />
    <Output TaskParameter="Value" PropertyName="$(GeneratedPropertyName)" />
</CreateProperty>

<!-- 可选:验证属性生成结果 -->
<Message Condition="'$(Configuration)' == 'Debug'" Text="_ProdVersion = $(_ProdVersion)" />
<Message Condition="'$(Configuration)' == 'Debug'" Text="_PreProdVersion = $(_PreProdVersion)" />
<Message Condition="'$(Configuration)' == 'Debug'" Text="_TestVersion = $(_TestVersion)" />

代码说明

  1. 自动拆分行:ReadLinesFromFile会将文本按换行拆分为VersionLines项集中的单个项,每个项对应一行内容,无需手动处理换行。
  2. 生成元数据:为每个项添加EnvName和Version元数据,其中EnvName会将Pre-Prod转换为PreProd,以匹配目标属性名格式。
  3. 动态生成属性:通过CreateProperty任务遍历所有项,用EnvName拼接属性名(_%(EnvName)Version),并赋值为对应的版本号。

内容的提问来源于stack exchange,提问作者8oris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:20:12