Подтвердить что ты не робот

Как заменить строку в файле с помощью msbuild?

Я хочу заменить строку типа "как r u" в файле test.xml со строкой "i am fine" в другом файле xy.xml.using регулярное выражение в ms build.

т.е. я должен прочитать строку из одного файла (xy.xml) и заменить ее в другом файле test.xml. поэтому, пожалуйста, предоставьте необходимые шаги для решения этой проблемы с примером

4b9b3361

Ответ 1

EDIT: этот ответ устарел. Используйте решение ниже...

Используйте задачу ReadLinesFromFile, чтобы получить замену строки из файла xy.xml. Проверьте это

Затем используйте значение из xy.xml в качестве строки замены для задачи FileUpdate. Проверьте это

И соединить все это;)

Ответ 2

Это больше не требуется... теперь вы можете ввести С# в файл проекта/сборки...

Определите пользовательскую задачу и параметры следующим образом:

<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  <ParameterGroup>
    <InputFilename ParameterType="System.String" Required="true" />
    <OutputFilename ParameterType="System.String" Required="true" />
    <MatchExpression ParameterType="System.String" Required="true" />
    <ReplacementText ParameterType="System.String" Required="true" />
  </ParameterGroup>
  <Task>
    <Reference Include="System.Core" />
    <Using Namespace="System" />
    <Using Namespace="System.IO" />
    <Using Namespace="System.Text.RegularExpressions" />
    <Code Type="Fragment" Language="cs">
      <![CDATA[
            File.WriteAllText(
                OutputFilename,
                Regex.Replace(File.ReadAllText(InputFilename), MatchExpression, ReplacementText)
                );
          ]]>
    </Code>
  </Task>
</UsingTask>

Затем просто назовите его, как и любую другую задачу MSBuild

<Target Name="AfterBuild">
  <ReplaceFileText 
    InputFilename="$(OutputPath)File.exe.config" 
    OutputFilename="$(OutputPath)File.exe.config" 
    MatchExpression="\$version\$" 
    ReplacementText="1.0.0.2" />
</Target>

Приведенный выше пример заменяет "$ version $" на "1.0.0.2" в "File.exe.config", расположенный в выходном каталоге.

Ответ 4

Я запустил обе замены для того же файла, который находится на диске Unix, и использовал путь unc к нему \server\path...:

<ReplaceFileText
  InputFilename="$(fileToUpdate)"
  OutputFilename="$(fileToUpdate)"
  MatchExpression="15.0.0"
  ReplacementText="15.3.1"/>


<FileUpdate Files="$(fileToUpdate2)"
            Regex="15.0.0"
            ReplacementText="15.3.1" />

и пользовательское действие cs выше не добавляет bom; однако FileUpdate сделал:

%head -2 branding.h branding2.h
==> branding.h <==
#/* branding.h
#** This file captures common branding strings in a format usable by both sed and C-preprocessor.

==> branding2.h <==
#/* branding.h
#** This file captures common branding strings in a format usable by both sed and C-preprocessor.

Спасибо csharptest.net. Я делал exec с perl-подзаголовками для сборников unix.