msbuild - sed命令错误 - 如何包含单引号和双引号

问题描述:

我有一个GNU makefile,我正在翻译为MSBuildmsbuild - sed命令错误 - 如何包含单引号和双引号

有包含与该是应该关闭Command属性Exec任务的单引号干扰sed不会在MSBuild运行,因为它包含了'(单引号)命令:

<Target Name="prebuild_cat"> 
    <Exec 
     EchoOff="true" 
     StandardOutputImportance="low" 
     StandardErrorImportance="low" 
     IgnoreExitCode="true" 
     ConsoleToMSBuild="true" 
     Command=' $(GnuSed) 's/^Q(.*)/"&"/'  
    '> 
    </Exec> 
</Target> 

当我运行这个,Visual Studio说

错误MSB4025:该项目文件无法加载。 's'是一个意想不到的标记。期待空白。行244,位置25.

当我更换'&apos;"&quot;

<Target Name="prebuild_cat"> 
    <Exec 
     EchoOff="true" 
     StandardOutputImportance="low" 
     StandardErrorImportance="low" 
     IgnoreExitCode="true" 
     ConsoleToMSBuild="true" 
     Command=' $(GnuSed) &apos;s/^Q(.*)/&quot;&&quot;/&apos;  
    '> 
    </Exec> 
</Target> 

错误MSB4025:项目文件无法加载。解析EntityName时发生错误。

+0

此问题的任何更新?你解决了这个问题吗?如果没有,请让我知道这个问题的最新状态。 –

+0

@ Leo-MSFT我选择了一个答案:我的问题是我忘记用'&' – Adrian

的MSBuild - sed的命令错误 - 如何将单引号和双引号

根据该文件MSBuild Special Characters

的MSBuild保留一些字符在特定情境下的特殊用途。如果你想在保留它们的上下文中直接使用它们,你只需要转义这些字符。

要转义特殊字符,请使用语法%xx,其中xx表示字符的ASCII十六进制值。

在这种情况下,单引号是ASCII字符39,即十六进制27。而对于&值是26,所以正确的转义序列是:

'$(GnuSed) %27s/^Q(.*)/"%26"/%27' 

下面是我的测试样品,你可以检查它是否适合你:

<Target Name="prebuild_cat" AfterTargets="Build"> 
    <Message Text='$(GnuSed) %27s/^Q(.*)/"%26"/%27' Importance='high' /> 
    </Target> 

结果在输出窗口:

1>prebuild_cat: 
1> 's/^Q(.*)/"&"/' 
1> 
1>Build succeeded. 
+0

替换'&'它也可以使用'&''"'''' – Adrian