我使用 Visual Studio makefile 项目并在 vcxproj 文件的 NMakeBuildCommandLine 属性中有单独的构建命令。
当这些命令之一使用这样的输出重定向时:
echo "unwanted output" >nul 2>&1
调用 msbuild 时出现构建错误:
all.vcxproj(53,30): error MSB4025:
The project file could not be loaded. An error occurred while parsing EntityName. Line 53, position 30.
Die Projektdatei konnte nicht geladen werden. Beim Analysieren von 'EntityName' ist ein Fehler aufgetreten. Zeile 53, Position 30.
为什么?
我自己找到了解决方案,想在这里提供。
只有在 vcxproj 文件中直接编辑
NMakeBuildCommandLine
才会发生此错误。 原因是,
>
和&
是无效的特殊字符。 >
和&
没有列出,尽管它们在XML元素中是无效的并且vcxproj是xml.
MSBuild 帮助说
要转义特殊字符,请使用语法 %
,其中 表示字符的 ASCII 十六进制值。
表示替换
echo "unwanted output" >nul 2>&1
与
echo "unwanted output" %3enul 2%3e%261
通过尝试,我发现以下变体也有效:
echo "unwanted output" >nul 2>&1
echo "unwanted output" >nul 2>&1
有趣的是,之后只有最后两个变体在项目属性 > NMake > Build Command Line 中正确显示为
>nul 2>&1
。 >nul 2>&1
,VS将>nul 2>&1
写入vcxproj。
而且由于最后一个变体比十六进制语法更具可读性,我也更喜欢这个。
我用 Visual Studio 17.2.5 测试过。
here也有类似的答案,但它既没有提到字符
>
(用于输出重定向但不包含在MSBuild帮助中)也没有提到NMakeBuildCommandLine(这是我遇到的问题来自(哪里)。