String 在MSBuild中生成一个字符串,作为基本字符串的n次串联

String 在MSBuild中生成一个字符串,作为基本字符串的n次串联,string,msbuild,msbuild-4.0,String,Msbuild,Msbuild 4.0,我在MSBuild的属性中有一个数字“n”。我还有一个字符串“Str”,需要复制n次才能得到一个最终的字符串,即重复“Str”n次 如果n是3,Str是“abc”,我想得到的是“abcabc” 由于不能在MSBuild中循环,我不知道如何实现这一点。可能使用项目组,但如何基于包含“n”计数的属性创建项目组 谢谢 通常对于这样的事情,我决定使用内联C#,因为它比在互联网上搜索找到“真正的”msbuild解决方案花费的时间要少;给你: <?xml version="1.0" encoding=

我在MSBuild的属性中有一个数字“n”。我还有一个字符串“Str”,需要复制n次才能得到一个最终的字符串,即重复“Str”n次

如果n是3,Str是“abc”,我想得到的是“abcabc”

由于不能在MSBuild中循环,我不知道如何实现这一点。可能使用项目组,但如何基于包含“n”计数的属性创建项目组


谢谢

通常对于这样的事情,我决定使用内联C#,因为它比在互联网上搜索找到“真正的”msbuild解决方案花费的时间要少;给你:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <MyString>abc</MyString>
    <Count>3</Count>
  </PropertyGroup>

  <UsingTask TaskName="RepeatString" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
      <s ParameterType="System.String" Required="true" />
      <n ParameterType="System.Int32" Required="true" />
      <result ParameterType="System.String" Output="true" />
    </ParameterGroup>
    <Task>
      <Code Type="Fragment" Language="cs"><![CDATA[
        result = string.Concat( Enumerable.Repeat( s, n ) );
        ]]></Code>
    </Task>
  </UsingTask>

  <Target Name="doit">
    <RepeatString s="$(MyString)" n="$(Count)">
      <Output PropertyName="result" TaskParameter="result" />
    </RepeatString>
    <Message Text="Result = $(result)"/>
  </Target>

</Project>

abc
3.


要创建重复n次的字符串,也可以这样做(至少在MSBuild Tools v4.0中):

$([System.String]::新建(“-”,40))

谢谢,这当然比我希望的要麻烦一些,但它确实做到了。正如您所说,找到“真正”的msbuild解决方案很棘手。这就是为什么我在使用这些解决方案时遇到问题:for me$(MSBuildToolsPath)=“C:\Windows\Microsoft.NET\Framework\v2.0.50727”,其中没有“Microsoft.Build.Tasks.v4.0.dll”,尽管我显然在使用MSBuild 4,因为我可以使用属性函数?这似乎是您的安装/设置中的一个问题?您是否使用了上面的代码,包括ToolsVersion=“4.0”选项?这导致根据Aha设置MsBuildToolsPath,不,我没有使用完全相同的代码,我将其集成到自己的脚本中,并且似乎没有设置ToolsVersion标志。然而,设置它并没有帮助,我仍然得到了指向2.0的错误路径。虽然它与您的脚本一样工作,但我的脚本中一定有错误,试图找出原因。
<SomeRepeatedString>$([System.String]::New("-", 40))</SomeRepeatedString>