如何在MSBuild中格式化文本?

4

具体来说,我希望将数字补零以创建基于字符串的标签。例如,将7转换为007。您可以轻松地将字符串相加,但在所有关于格式化、填充、字符串等方面的搜索中,我都没有找到任何相关的参考资料。

以下是我正在处理的示例。

<PropertyGroup>
  <FileParserVersion>File Parser $(Major).$(Minor).$(Build) Build $(Revision)</FileParserVersion>
  <VersionComment>Automated build: $(FileParserVersion)</VersionComment>
</PropertyGroup>

这是生成的版本号: FILEPARSER_1_0_3_BUILD_7
更推荐使用的版本号: FILEPARSER_1_0_3_BUILD_007

2个回答

11

在4.0+中,您可以使用属性函数(和MSDN上的说明)以一行代码实现它。

$([System.String]::Format('FILEPARSER_$(Major)_$(Minor)_$(Build)_BUILD_{0:000}', $([MSBuild]::Add($(Revision), 0))))

不幸的是,虚假的“Add”是必需的,以欺骗MSBuild将$(Revision)强制转换为数字,然后将其强制转换为String.Format所期望的对象。如果我不这样做,它会使用字符串,而填充不起作用。在MSBuild内部进行的强制转换可能需要更加智能一些。


2
使用 $([System.Int32]::Parse($(Revision)) 也可以工作。 - Hasani Blackwell

5

考虑以下ITask:

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace My.MSBuild.Tasks
{
    public class FormatRevision : Task
    {
        #region Public Properties

        [Required]
        public int Revision { get; set; }

        [Required]
        public string MajorVersion { get; set; }

        [Output]
        public string OutputVersion { get; private set; }

        #endregion

        #region ITask Methods

        public override bool Execute()
        {
            OutputVersion = string.Format("{0}.{1}"
                , MajorVersion
                , Revision < 10 ?
                    "00" + Revision : Revision < 100 ?
                        "0" + Revision : Revision.ToString());

            Log.LogMessage("Revision: {0} -> Output Version: {1}"
                 , Revision, OutputVersion);

            return true;
        }

        #endregion
    }
}

MSBuild目标(formatvesion.proj):


 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

 <Target Name="FormatRevision"> 
    <FormatRevision MajorVersion="$(MajorVersion)" Revision="$(Revision)">
        <Output TaskParameter="OutputVersion" PropertyName="FormattedVersion"/>
     </FormatRevision>
  </Target>

 <UsingTask TaskName="My.MSBuild.Tasks.FormatRevision" AssemblyFile="My.MSBuild.Tasks.dll" /> 

 </Project>

由命令调用:

msbuild formatvesion.proj /t:FormatRevision /p:MajorVersion=1.0;Revision=7

或者,如果您希望使用CreateProperty:

<PropertyGroup>
  <FileParserVersion>File Parser $(Major).$(Minor).$(Build) Build $(Revision)</FileParserVersion>
  <VersionComment>Automated build: $(FileParserVersion)</VersionComment>
</PropertyGroup>

<PropertyGroup>
  <PaddedRevision Condition="$(Revision) &lt; 1000">$(Revision)</PaddedRevision> 
  <PaddedRevision Condition="$(Revision) &lt; 100">0$(Revision)</PaddedRevision>  
  <PaddedRevision Condition="$(Revision) &lt; 10">00$(Revision)</PaddedRevision>
</PropertyGroup>

<Target Name="test"> 

    <CreateProperty 
        Value="FILEPARSER_$(Major)_$(Minor)_$(Build)_BUILD_$(PaddedRevision)">
        <Output TaskParameter="Value" PropertyName="MyFileVersion" />
    </CreateProperty>
    <Message Text="$(VersionComment) -> $(MyFileVersion)" />

</Target>

我不想改变版本,我正在尝试创建一个文本字符串,该字符串将用作源代码控制中的标签,并用作部署到QA的文件夹名称。 - Shire
CreateProperty任务应该做什么: http://msdn.microsoft.com/en-us/library/63ckb9s9.aspx 如果它没有完成,那么请发布一些您正在尝试调试的项目片段。 - KMoraz
我在原始代码中添加了一个片段,其中包含实际输出和期望输出。 - Shire
请查看我上面更新的示例。鉴于您片段中的属性,它可以产生所需的输出。 - KMoraz
太棒了!我甚至没有想过尝试一些聪明的数学! - Shire
更整洁的方法是使用 Right("000" + Revision.ToString(), 3)。 - Bart Janson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接