如何在 Visual Studio 2017 (C#) 中抑制初始 post-build 事件错误?
How to suppress initial post-build event error in 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
放在项目的post-build事件命令行中,然后build。现在我在 Visual Studio 错误列表中收到 两条 错误消息:
The command "[path to script]\foobar.bat" exited with code -1.
This is a test error.
在这种情况下,看到仅打印出我的 post-build 事件内容的第一条错误消息没有帮助。我想抑制这个初始错误,以便只有我的自定义错误消息显示在错误列表中(或者至少将其更改为更有用的内容)。
这是我尝试过的方法:
- 在我的批处理脚本末尾添加
2>nul
没有任何效果。
- 将
1>nul
添加到我的批处理脚本的末尾会抑制 两个 错误,这不是我想要的。
- 在我的批处理脚本末尾添加
&set errorlevel=0
没有任何效果。
- 将行
exit 0
添加到我的批处理脚本的末尾没有任何效果。
- 将以下内容添加到我的 .csproj 文件的末尾(根据 this article)抑制第一个错误,但使构建不再失败:
<Target
Name="PostBuildEvent"
Condition="'$(PostBuildEvent)'!=''"
DependsOnTargets="$(PostBuildEventDependsOn)">
<Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" IgnoreExitCode="true" />
</Target>
最后一个选项几乎让我得到了我想要的。但是,尽管有错误消息,但错误列表不会弹出,构建也不会失败。似乎任何会导致初始错误消息不出现的事情也会导致构建不再失败。是这样吗?或者有什么方法可以让构建失败 而不会 显示初始错误消息?
您可以做的是一起使用 exec
and an error
任务。
您需要编辑 .csproj 文件并在上面最后一个要点的 Target PostBuildEvent
之后添加这些任务。
此解决方案的工作原理是获取 exec 任务的 ExitCode
和 Output
,并使用它们触发错误任务,然后停止构建并记录消息。
Exec
任务需要三个参数:
IgnoreStandardErrorWarningFormat
和 IgnoreExitCode
防止在这一步记录错误
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 添加到我的批处理脚本的末尾没有任何效果。
要忽略单个命令的退出代码,请使用 ||不是 & 或 &&。例如
Robocopy || set errorlevel=0
这表示仅当 RoboCopy 以错误级别退出时!= 0,设置错误级别=0
“&&”在此批处理文件中的作用是什么?] 解释了这一点以及更多内容
历史笔记
单个符号,例如
(prog1 arg1 arg2) & (cmd2 arg1 arg2 arg3)
运行这两个命令。它在 DOS 中不是很有用。在 Unix 中,它同时运行两个命令(2 个进程),等待两个命令完成。由于 DOS 不支持多进程,'&' 只是 运行 顺序的语法糖。
单管道prog1 | prog2 在 DOS 中受到同样的限制。在 Unix 中,prog1 在 stdout 上写入适度数量后,prog2 可以在其 stdin 上使用它。
在 DOS 中这是 shorthand for
prog1 > tmpFile
prog2 < tmpFile
在许多情况下,这种方法效果很好。在 write1Meg | 的简单情况下头,(或更多)
DOS 之前必须 运行 完成,head 可以在读取第一个 10 行后退出。
& 是做什么的?
Unix 也支持 & 在命令行的末尾
程序 1 &
这会快速启动 prog1 和 returns 对控制台的控制。
&& 和 ||只有当您知道退出代码 0 被视为 'true' 而非零被视为 'false' 时才有意义。还完成了短路评估,因此检查第一个退出代码后的第二个命令。
prog1 && prog2
prog1 退出后,prog2 仅在 exitcode == 0 时运行
prog1 || prog2
prog1 退出后 prog2 仅在退出代码 != 0 时运行
我在 Visual Studio 2017 年有一个 C# 解决方案。我还有一个名为 foobar.bat
的批处理脚本,其中包含以下代码:
echo foobar : error 1: This is a test error.
我的目标是 只有 上面的测试错误消息在我构建特定项目时出现在 Visual Studio 的错误列表中并停止构建当它出现时。所以我把[path to script]\foobar.bat
放在项目的post-build事件命令行中,然后build。现在我在 Visual Studio 错误列表中收到 两条 错误消息:
The command "[path to script]\foobar.bat" exited with code -1.
This is a test error.
在这种情况下,看到仅打印出我的 post-build 事件内容的第一条错误消息没有帮助。我想抑制这个初始错误,以便只有我的自定义错误消息显示在错误列表中(或者至少将其更改为更有用的内容)。
这是我尝试过的方法:
- 在我的批处理脚本末尾添加
2>nul
没有任何效果。 - 将
1>nul
添加到我的批处理脚本的末尾会抑制 两个 错误,这不是我想要的。 - 在我的批处理脚本末尾添加
&set errorlevel=0
没有任何效果。 - 将行
exit 0
添加到我的批处理脚本的末尾没有任何效果。 - 将以下内容添加到我的 .csproj 文件的末尾(根据 this article)抑制第一个错误,但使构建不再失败:
<Target
Name="PostBuildEvent"
Condition="'$(PostBuildEvent)'!=''"
DependsOnTargets="$(PostBuildEventDependsOn)">
<Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" IgnoreExitCode="true" />
</Target>
最后一个选项几乎让我得到了我想要的。但是,尽管有错误消息,但错误列表不会弹出,构建也不会失败。似乎任何会导致初始错误消息不出现的事情也会导致构建不再失败。是这样吗?或者有什么方法可以让构建失败 而不会 显示初始错误消息?
您可以做的是一起使用 exec
and an error
任务。
您需要编辑 .csproj 文件并在上面最后一个要点的 Target PostBuildEvent
之后添加这些任务。
此解决方案的工作原理是获取 exec 任务的 ExitCode
和 Output
,并使用它们触发错误任务,然后停止构建并记录消息。
Exec
任务需要三个参数:
IgnoreStandardErrorWarningFormat
和IgnoreExitCode
防止在这一步记录错误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 添加到我的批处理脚本的末尾没有任何效果。
要忽略单个命令的退出代码,请使用 ||不是 & 或 &&。例如
Robocopy || set errorlevel=0
这表示仅当 RoboCopy 以错误级别退出时!= 0,设置错误级别=0
“&&”在此批处理文件中的作用是什么?]
历史笔记 单个符号,例如
(prog1 arg1 arg2) & (cmd2 arg1 arg2 arg3)
运行这两个命令。它在 DOS 中不是很有用。在 Unix 中,它同时运行两个命令(2 个进程),等待两个命令完成。由于 DOS 不支持多进程,'&' 只是 运行 顺序的语法糖。
单管道prog1 | prog2 在 DOS 中受到同样的限制。在 Unix 中,prog1 在 stdout 上写入适度数量后,prog2 可以在其 stdin 上使用它。
在 DOS 中这是 shorthand for
prog1 > tmpFile
prog2 < tmpFile
在许多情况下,这种方法效果很好。在 write1Meg | 的简单情况下头,(或更多) DOS 之前必须 运行 完成,head 可以在读取第一个 10 行后退出。
& 是做什么的? Unix 也支持 & 在命令行的末尾 程序 1 & 这会快速启动 prog1 和 returns 对控制台的控制。
&& 和 ||只有当您知道退出代码 0 被视为 'true' 而非零被视为 'false' 时才有意义。还完成了短路评估,因此检查第一个退出代码后的第二个命令。
prog1 && prog2
prog1 退出后,prog2 仅在 exitcode == 0 时运行
prog1 || prog2
prog1 退出后 prog2 仅在退出代码 != 0 时运行