如何阻止MSBuild将反斜杠替换为正斜杠?

如何阻止MSBuild将反斜杠替换为正斜杠?,msbuild,msbuild-4.0,Msbuild,Msbuild 4.0,MSBuild通常将生成文件(通常位于路径中)中的反斜杠替换为正斜杠,这在处理跨平台项目时很有帮助。但我有一个任务不希望MSBuild碰到反斜杠:我们的构建中有一个自定义任务,它接受正则表达式和替换任务,并更新文件。(我正在使用它更新AssemblyInfo.cs文件中的版本号,从git Descripte获取版本号。如果我能控制它的运行时间,TeamCity构建功能就可以工作,但这是另一回事——可以说,在我的MSBuild文件中这样做看起来是目前最好的方法) 我的问题是,MSBuild“帮助”

MSBuild通常将生成文件(通常位于路径中)中的反斜杠替换为正斜杠,这在处理跨平台项目时很有帮助。但我有一个任务不希望MSBuild碰到反斜杠:我们的构建中有一个自定义任务,它接受正则表达式和替换任务,并更新文件。(我正在使用它更新AssemblyInfo.cs文件中的版本号,从
git Descripte
获取版本号。如果我能控制它的运行时间,TeamCity构建功能就可以工作,但这是另一回事——可以说,在我的MSBuild文件中这样做看起来是目前最好的方法)

我的问题是,MSBuild“帮助”了我,在我传递给自定义任务的属性中用正斜杠替换反斜杠,这对我的正则表达式造成了严重破坏。我写的是:

<FileUpdate File="$(RootDir)/GlobalAssemblyInfo.cs" Regex='AssemblyFileVersion\("[^"]+"\)' ReplacementText='AssemblyFileVersion("$(VersionNumber)")' />
注意我的正则表达式中的反斜杠是如何变成正斜杠的吗?是的,这与我的AssemblyInfo.cs文件中的任何内容都不匹配

我可以通过完全避免在正则表达式中使用反斜杠来解决这个问题,如下所示:

<FileUpdate File="$(RootDir)/GlobalAssemblyInfo.cs" Regex='AssemblyFileVersion[(]"[^"]+"[)]' ReplacementText='AssemblyFileVersion("$(VersionNumber)")' />


但这并不适用于所有情况。迟早我会需要一个包含
\s
的正则表达式,或者一些其他反斜杠表达式,然后我就会沉下去。在此之前,我很想知道如何告诉MSBuild“停止帮助我!我在这一个属性中说的是反斜杠,我的意思是反斜杠,而不是正斜杠。你可以用你喜欢的其他属性“帮助”我,但别管这个!”有什么想法吗?

您可以创建自己的替换文本任务,并通过简单地更改/到\或使用其他更独特的标记来控制错误替换的字符

<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
<ParameterGroup>
    <InputFilename 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(
                InputFilename,
                Regex.Replace(File.ReadAllText(InputFilename), MatchExpression.Replace('/', '\\'), ReplacementText)
            );
          ]]>
    </Code>
</Task>



源代码现在已打开,因此您可以调试并向Microsoft提出修复建议。
<UsingTask TaskName="ReplaceFileText" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
<ParameterGroup>
    <InputFilename 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(
                InputFilename,
                Regex.Replace(File.ReadAllText(InputFilename), MatchExpression.Replace('/', '\\'), ReplacementText)
            );
          ]]>
    </Code>
</Task>