2017-10-07 147 views
0

我有一個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

回答

1

的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