web-dev-qa-db-de.com

wie ersetze ich einen String in einer Datei mit msbuild?

Ich möchte eine Zeichenfolge wie "Wie geht es dir?" In der Datei "test.xml" durch eine Zeichenfolge "Mir geht es gut" in einer anderen Datei "xy.xml. using regular expression" in ms build ersetzen.

dh ich muss Zeichenkette von einer Akte (xy.xml) lesen und sie in einer anderen Akte test.xml ersetzen. Bitte geben Sie die notwendigen Schritte an, um dieses Problem mit einem Beispiel zu lösen

28
Nithin

EDIT: Diese Antwort ist veraltet. Lösung unten verwenden ...

Verwenden Sie die Task ReadLinesFromFile, um die Ersatzzeichenfolge aus der Datei xy.xml abzurufen. Überprüfen Sie dies

Verwenden Sie dann den Wert aus xy.xml als Ersatzzeichenfolge für die FileUpdate-Aufgabe. Überprüfen Sie dies

Und alles zusammen;)

4
Ludwo

Dies ist nicht mehr erforderlich ... Sie können jetzt C # in die Projekt-/Build-Datei einfügen ...

Definieren Sie eine benutzerdefinierte Aufgabe und Parameter wie folgt:

<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>

Dann rufen Sie es einfach wie jede andere MSBuild-Aufgabe auf

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

Das obige Beispiel ersetzt "$ version $" durch "1.0.0.2" in der "File.exe.config" im Ausgabeverzeichnis.

82
csharptest.net

Sie können die Aufgabe FileUpdate aus MSBuild Community-Aufgaben verwenden, wie im Artikel http://geekswithblogs.net/mnf/archive/2009/07/03/msbuild-task-to-replace-content- beschrieben. in-text-files.aspx

3
Victor Ionescu

Ich habe die beiden Ersetzungen für dieselbe Datei ausgeführt, die sich auf einem Unix-Laufwerk befindet, und den unc-Pfad zu\server\path verwendet:

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


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

und die benutzerdefinierte Aktion von cs oben fügt das bom nicht hinzu; Das FileUpdate hat jedoch Folgendes getan:

%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.

Danke, csharptest.net - Ich habe ausführende Befehle mit Perl-Untertitelbefehlen für Unix-Builds gemacht.

0
Tom