Visual Studio msbuild -为什么在VS NMake Build命令行中使用输出重定向时会出现错误MSB 4025?

wbgh16ku  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(206)

我使用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 33.

Die Projektdatei konnte nicht geladen werden. Beim Analysieren von 'EntityName' ist ein Fehler aufgetreten. Zeile 53, Position 33.
为什么?
我自己找到了解决方案,并希望在这里提供。

f5emj3cl

f5emj3cl1#

只有在直接编辑vcxproj文件中的NMakeBuildCommandLine时,才会发生此错误。
使用其他命令属性也会出现相同的错误。
原因是>&是无效的特殊字符。
MSBuild help中所述,特殊字符需要转义。
但是,在此帮助中没有列出>&,尽管它们在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

有趣的是,只有最后2个变量在项目属性〉NMake〉构建命令行中正确显示为>nul 2>&1
当直接编辑项目属性〉NMake〉Build Command Line,并输入>nul 2>&1时,VS会将>nul 2>&1写入vcxproj。
由于最后一个变体比十六进制语法更易读,我也更喜欢这个。
我用Visual Studio 17.2.5进行了测试。

  • 也有一个类似的答案here,但它既没有提到字符>(用于输出重定向,但不包含在MSBuild help中),也没有提到NMakeBuildCommandLine(这就是我遇到的问题)。

所以我决定做这个新的问题和答案来帮助其他有类似问题的人。

相关问题