如何在MSBuild中格式化文本?

如何在MSBuild中格式化文本?,msbuild,msbuild-task,Msbuild,Msbuild Task,具体来说,我希望用零填充一个数字来创建一个基于字符串的标签。i、 e.将第7个构建为第007个构建。您可以轻松地将字符串添加到一起,但在我所有关于格式、填充、字符串等的搜索中。。。我找不到任何推荐人 我正在使用的示例 <PropertyGroup> <FileParserVersion>File Parser $(Major).$(Minor).$(Build) Build $(Revision)</FileParserVersion> <Ver

具体来说,我希望用零填充一个数字来创建一个基于字符串的标签。i、 e.将第7个构建为第007个构建。您可以轻松地将字符串添加到一起,但在我所有关于格式、填充、字符串等的搜索中。。。我找不到任何推荐人

我正在使用的示例

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

文件分析器$(主)。$(次)。$(生成)生成$(修订)
自动生成:$(FileParserVersion)

这是生成的:FILEPARSER\u 1\u 0\u 3\u BUILD\u 7


首选内容:文件解析器\u 1\u 0\u 3\u构建\u 007

考虑以下问题:

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
    }
}
或者,如果希望使用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>

文件分析器$(主)。$(次)。$(生成)生成$(修订)
自动生成:$(FileParserVersion)
$(修订)
0$(修订版)
00美元(修订版)

在4.0+中,您可以使用(和)在一行中完成


不幸的是,在将$(修订版)强制为String.Format所需的对象之前,必须使用伪“Add”来欺骗MSBuild将$(修订版)强制为一个数字。如果我不这样做,它会使用一个字符串,填充就不起作用。MSBuild内部的强制在这里可能更聪明一些。

我不想更改版本,我正在尝试创建一个文本字符串,该字符串将用作源代码管理中的标签,并用作部署到QA的文件夹名。CreateProperty任务应该做的事:如果不做,发布您试图调试的项目的一些片段。我在原始版本中添加了一个片段,其中包含实际输出和所需输出。请参阅上面更新的示例。它根据代码段中的属性生成所需的输出。太好了!我甚至没有想到要尝试一点聪明的数学!使用$([System.Int32]::Parse($(Revision))也可以工作
msbuild formatvesion.proj /t:FormatRevision /p:MajorVersion=1.0;Revision=7
<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>
$([System.String]::Format('FILEPARSER_$(Major)_$(Minor)_$(Build)_BUILD_{0:000}', $([MSBuild]::Add($(Revision), 0))))