如何在Visual Studio 2017(C#)中抑制初始构建后事件错误?



我在Visual Studio 2017中有一个C#解决方案。我还有一个名为foobar.bat的批处理脚本,其中包含以下代码:

echo foobar : error 1: This is a test error.           

我的目标是在生成特定项目时使上面的测试错误消息出现在 Visual Studio 的错误列表中,并在生成出现时停止生成。因此,我[path to script]foobar.bat放入项目的生成后事件命令行中,然后生成。现在我在Visual Studio错误列表中收到两条错误消息:

  1. The command "[path to script]foobar.bat" exited with code -1.
  2. This is a test error.

在这种情况下,看到仅打印出我的后期生成事件内容的第一条错误消息是没有帮助的。我想抑制此初始错误,以便只有我的自定义错误消息显示在错误列表中(或至少更改它以表示更有用的内容)。

这是我尝试过的:

  • 2>nul添加到批处理脚本的末尾不起作用。
  • 1>nul添加到批处理脚本的末尾会抑制这两个错误,这不是我想要的。
  • &set errorlevel=0添加到批处理脚本的末尾不起作用。
  • 将行exit 0添加到批处理脚本的末尾不起作用。
  • 将以下内容添加到我的 .csproj 文件的末尾(根据本文)可以禁止第一个错误,但会使构建不再失败:
<Target
Name="PostBuildEvent"
Condition="'$(PostBuildEvent)'!=''"
DependsOnTargets="$(PostBuildEventDependsOn)">
<Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" IgnoreExitCode="true" />
</Target>

最后一个选项几乎得到了我想要的东西。但是,尽管有错误消息,但错误列表不会弹出,并且生成不会失败。似乎任何导致初始错误消息不显示的内容也会导致构建不再失败。是这样吗?或者有没有办法在不显示初始错误消息的情况下使构建失败?

您可以做的是同时使用execerror任务。

您需要编辑 .csproj 文件,并在您完成上述最后一个项目符号点的Target PostBuildEvent后添加这些任务。

此解决方案的工作原理是获取 exec 任务的ExitCodeOutput,并使用它们触发错误任务,然后停止生成并记录消息。
Exec任务需要三个参数:

  • IgnoreStandardErrorWarningFormatIgnoreExitCode防止在此步骤中记录错误
  • 需要ConsoleToMsBuild参数才能获取输出(在VS 2017中拼写为ConsoleToMSBuild)。

因此,任务如下所示:

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="$(PostBuildEvent)" IgnoreStandardErrorWarningFormat="true" IgnoreExitCode="true" ConsoleToMsBuild="true">
<Output TaskParameter="ConsoleOutput" PropertyName="OutputMessage" />
<Output TaskParameter="ExitCode" PropertyName="ExitCode" />
</Exec>
<Error Text="$(OutputMessage)" Condition="$(ExitCode) == 10" />
<!-- <Error Text="(optional text) : $(OutputMessage)" Condition="$(ExitCode) == 11" />
<Error Text="(optional text) : $(OutputMessage)" Condition="$(ExitCode) == 12" /> -->
</Target>

并编辑文件foobar.bat

echo foobar : error 1: This is a test error.
exit /b 10 <-- /b parameter needed if used in a .bat file

重要的部分是设置我们以后要使用的代码的exit

您可以让多个Error任务执行更多条件日志记录,或者仅按原样使用输出。

回复:将 &set errorlevel=0 添加到批处理脚本的末尾不起作用。

要忽略单个命令的退出代码,请使用 || not & 或 &&.,例如

Robocopy || set errorlevel=0

这说明只有当 RoboCopy 以错误级别 != 0 退出时,设置错误级别=0

"&&"在此批处理文件中做什么?1 解释这一点以及更多

内容历史笔记 单与号,例如

(prog1 arg1 arg2) & (cmd2 arg1 arg2 arg3)

运行这两个命令。它在DOS中不是很有用。在Unix中,它同时运行两个命令(2个进程),等待两个命令完成。由于DOS不支持多进程,因此"&"只是用于顺序运行的语法糖。

单管道 prog1 | prog2 在 DOS 中也受到同样的限制。在 Unix 中,prog1 在 stdout 上写入少量内容后,它可以在其 stdin 上写入 prog2。

在DOS中,这是

prog1 > tmpFile
prog2 < tmpFile

在许多情况下,这已经足够好了。在write1Meg |头部,(或更多) DOS必须先运行完成,头部在读取第10行后可以退出。

做什么和做什么? Unix还支持&在命令行的末尾 prog1 & 这将启动 prog1 并快速将控制权返回给控制台。

&&&和 || 只有当您知道退出代码 0 被视为"真"而非零被视为"假"时才有意义。同时进行短路评估,因此第二个命令在检查第一个命令的退出代码后。

prog1 && prog2

prog1 退出后,prog2 仅在退出代码 == 0 时运行

prog1 || prog2

在 prog1 退出后,prog2 仅在退出代码 != 0 时运行

最新更新