2009-03-19 4 views
0

У меня есть следующие строки в моем файле проекта MSBuild:Как заменить расширение пути файла, сохраненного в свойстве MSBuild?

<PropertyGroup> 
    <TestResultsFileName Condition=" '$(TestResultsFileName)' == '' "> 
     TestResults.trx 
    </TestResultsFileName> 
    <TestResultsFilePath>$(OutDir)\$(TestResultsFileName)</TestResultsFilePath> 
</PropertyGroup> 

Мне нужно создать еще один файл, имеющий то же имя, TestResultsFilePath только с расширением .xml. Поэтому я хочу иметь свойство хранить путь к файлу другого файла.

Сначала я подумал, что что-то подобное будет работать:

<PropertyGroup> 
    <NUnitResultsFilePath> 
     $(OutDir)\$(TestResultsFileName->'%(Filename).xml') 
    </NUnitResultsFilePath> 
</PropertyGroup> 

И, конечно, это не так, потому что TestResultsFileName это не коллекционная вещь. К сожалению, это не может быть так, потому что это параметр для некоторой задачи, которая ожидает простое значение, а не набор.

Итак, мой вопрос заключается в том, как заменить расширение значения свойства TestResultsFileName на .xml?

Спасибо.

ответ

0

Ничего. Я написал пользовательское задание, чтобы сделать работу:

public class ReplaceExtension : Task 
    { 
     [Required] 
     public string FilePath { get; set; } 

     public string NewExtension { get; set; } 

     [Output] 
     public string Result { get; set; } 

     public override bool Execute() 
     { 
      if (string.IsNullOrEmpty(FilePath)) 
      { 
       Log.LogError("FilePath cannot be empty!"); 
       return false; 
      } 

      try 
      { 
       int length = FilePath.Length; 
       int startIndex = length; 
       int oldExtensionLength = 0; 
       while (--startIndex >= 0) 
       { 
        char ch = FilePath[startIndex]; 
        if (ch == '.') 
        { 
         oldExtensionLength = length - startIndex; 
         break; 
        } 
        if (ch == Path.DirectorySeparatorChar || 
         ch == Path.AltDirectorySeparatorChar || 
         ch == Path.VolumeSeparatorChar) 
        { 
         break; 
        } 
       } 

       bool isNewExtensionEmpty = string.IsNullOrEmpty(NewExtension) || 
        (NewExtension.Length == 1 && NewExtension[0] == '.'); 

       if (isNewExtensionEmpty) 
       { 
        // The new extension is empty - remove the old extension. 
        if (oldExtensionLength > 0) 
        { 
         Result = FilePath.Remove(startIndex, oldExtensionLength); 
        } 
        else 
        { 
         Result = FilePath; 
        } 
       } 
       else 
       { 
        // Replace the old extension with the new one. 
        StringBuilder sb = new StringBuilder(FilePath.Length - oldExtensionLength + 
         NewExtension.Length + (NewExtension[0] == '.' ? 0 : 1)); 
        sb.Append(FilePath, 0, FilePath.Length - oldExtensionLength); 
        if (NewExtension[0] != '.') 
        { 
         sb.Append('.'); 
        } 
        sb.Append(NewExtension); 
        Result = sb.ToString(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Log.LogErrorFromException(ex); 
      } 
      return !Log.HasLoggedErrors; 
     } 
    } 

Я использую это так:

<Target Name="CreateProperties"> 
    <ReplaceExtension FilePath="$(TestResultsFilePath)" NewExtension="xml"> 
     <Output TaskParameter="Result" PropertyName="NUnitResultsFilePath"/> 
    </ReplaceExtension> 
    </Target>