为何MSBuild会在Exec检测的错误行路径冒号两侧添加空格?
MSBuild Exec任务输出格式问题解答
项目代码示例
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets='repro'> <Target Name = 'no_spaces'> <Exec Command = 'echo C:\path\to\file.ext (5) error ERR999'/> </Target> <Target Name = 'spaces'> <Exec Command = 'echo C:\path\to\file.ext (5) error ERR999:'/> </Target> <Target Name = 'repro' DependsOnTargets = 'no_spaces;spaces'/> </Project>
执行输出
MSBuild version 17.5.0+6f08c67f3 for .NET Framework no_spaces: echo C:\path\to\file.ext (5) error ERR999 C:\path\to\file.ext (5) error ERR999 spaces: echo C:\path\to\file.ext (5) error ERR999: C : \path\to\file.ext (5) error ERR999: [C:\path\to\msbuild.proj]
1. 为何最后一行以C : \path而非C:\path开头?
这是MSBuild错误输出解析逻辑的误判导致的:当Exec任务的输出行末尾带有冒号:时,MSBuild会错误地将其识别为[驱动器号]:[路径]的格式,触发内部路径格式化规则,在驱动器号与冒号、冒号与路径开头之间强行插入空格,同时自动追加当前项目文件路径作为上下文标注。
本质上是MSBuild把输出里的末尾冒号当成了路径标识的一部分,进而执行了不符合预期的格式化操作。
2. 是否有办法避免添加这些空格?
有三种实用的解决方法:
- 调整输出格式:直接去掉输出行末尾的冒号
:,从根源上绕过MSBuild的误判逻辑。 - 禁用错误格式解析:在Exec任务中添加
IgnoreStandardErrorWarningFormat="true"属性,让MSBuild不对输出内容做错误格式的解析和格式化,示例代码:<Target Name = 'spaces'> <Exec Command = 'echo C:\path\to\file.ext (5) error ERR999:' IgnoreStandardErrorWarningFormat="true"/> </Target> - 转义或调整冒号位置:如果必须保留冒号,可以将冒号放在引号内,或者调整冒号在输出中的位置,避免触发MSBuild的路径识别逻辑。
该问题属于MSBuild的已知缺陷,官方内部已确认这是解析逻辑存在的问题。
内容的提问来源于stack exchange,提问作者alx9r
相关产品推荐
相关产品推荐

