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

Все это хорошо, но seq предположительно устарел, и большинство из них работают только с числовыми диапазонами.

Если вы заключите цикл for в двойные кавычки, стартовые и конечные переменные будут разыменованы, когда вы будете эхо-строки , и вы можете отправить строку обратно в BASH для выполнения. $i должен быть экранирован, поэтому он НЕ оценивается перед отправкой на подоболочку.

RANGE_START=a
RANGE_END=z
echo -e "for i in {$RANGE_START..$RANGE_END}; do echo \\${i}; done" | bash

Этот вывод также может быть назначен переменной:

VAR=`echo -e "for i in {$RANGE_START..$RANGE_END}; do echo \\${i}; done" | bash`

Единственный «служебный» ресурс, который должен генерировать, должен быть вторым экземпляром bash, поэтому он должен быть подходящим для интенсивных операций.

29
задан Nithin 23 October 2011 в 16:27
поделиться

4 ответа

РЕДАКТИРОВАТЬ: Этот ответ устарел. Используйте решение ниже ...

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

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

И соберите все вместе;)

4
ответ дан Ludwo 23 October 2011 в 16:27
поделиться

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

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

<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 ", расположенном в выходном каталоге.

85
ответ дан csharptest.net 23 October 2011 в 16:27
поделиться

Вы можете использовать задачу FileUpdate из Задач сообщества MSBuild, как описано в статье http://geekswithblogs.net/mnf/archive/2009/07/03/msbuild-task-to-replace-content-in -text-files.aspx

3
ответ дан Victor Ionescu 23 October 2011 в 16:27
поделиться

Я запустил обе замены для одного и того же файла, который находится на диске 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 выше не добавляет бомба; однако 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 subtitute для сборок unix.

0
ответ дан Tom 23 October 2011 в 16:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: