如何仅在msbuild存在时终止任务
需要终止msbuild中的任务,但仅当此任务正在运行时 你是怎么做到的 如果我有下面这样的内容,我如何修改以仅在运行时终止进程如何仅在msbuild存在时终止任务,msbuild,Msbuild,需要终止msbuild中的任务,但仅当此任务正在运行时 你是怎么做到的 如果我有下面这样的内容,我如何修改以仅在运行时终止进程 <!-- List of processes to kill --> <ItemGroup> <Process Include="Process1.exe" /> </ItemGroup> <Target Name = "Kill"> <Exec Comm
<!-- List of processes to kill -->
<ItemGroup>
<Process Include="Process1.exe" />
</ItemGroup>
<Target Name = "Kill">
<Exec Command="taskkill /F /IM %(Process.Identity)" IgnoreExitCode="true" />
</Target>
</Project>
非常感谢好的,我会回答这个问题,因为它不再适合评论了 以下是对我有效的方法,因为如果所讨论的进程不存在,它不会导致MSBuild以错误结束:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Kill" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- List of processes to kill -->
<ItemGroup>
<Process Include="Process1.exe" />
</ItemGroup>
<Target Name = "Kill">
<Exec Command="taskkill /F /IM %(Process.Identity)"
IgnoreExitCode="true"
IgnoreStandardErrorWarningFormat="true"/>
</Target>
</Project>
是的,在所有进程都不存在之后,实际的taskkill.exe
命令“失败”并出现错误128。但是,它不会导致构建失败。就是,
它仅供参考
如果根据Kill
目标有其他目标,它们将运行
当然,这也意味着您无法确定Kill
目标是否确实成功地终止了所讨论的进程(如果它存在的话)。
因为在这种情况下,错误也会被忽略
如果您可以接受,那么在尝试终止该进程之前,无需确定该进程是否存在
请注意,任何地方都存在竞争条件。假设您在终止进程之前编写了一些代码来检查进程是否存在。该代码会告诉您“是的,进程存在”,但当实际的taskkill
执行时,该进程可能已经终止(自行终止或被其他人终止)。因此,不管怎样,最终你必须忍受taskkill
的失败
因此,为了解决这个问题,最好在MSBuild中评估taskkill
命令的退出代码,并相应地执行以下操作:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Kill" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- List of processes to kill -->
<ItemGroup>
<Process Include="process1.exe" />
</ItemGroup>
<Target Name = "Kill">
<Exec Command="taskkill /F /IM %(Process.Identity)"
IgnoreExitCode="true"
IgnoreStandardErrorWarningFormat="true">
<Output TaskParameter="ExitCode" PropertyName="ErrorCode"/>
</Exec>
<Error Text="Cannot kill process." Condition="$(ErrorCode) == 1"/>
<Message Text="Process does not exist." Condition="$(ErrorCode) == 128"/>
</Target>
</Project>
taskkill
的常见(可能?)退出代码似乎是:
- 0成功
- 1个进程存在,但无法终止(例如权限问题)
- 128进程不存在
(请参阅相关主题。)可能有不包含自定义任务的解决方案,但我建议。除此之外,为什么还要麻烦呢?您的
Exec
,如果所讨论的流程不存在,它将不会执行任何操作。您是说我加载的示例已经满足了我的要求吗?如果是这种情况,它也不起作用,请将ignorestandarderrowarningformat=“true”
添加到Exec
元素。感谢您的时间,我收到错误128Wow,让我消化一下您的解释非常好,但是我们的内部构建仍然失败。我想没有办法把它变成成功?那么,你必须提供更多关于实际错误和构建系统的信息。考虑一个新的问题有更多的(详细的)信息。我很高兴和感谢你的回答谢谢你的时间肯定为什么,但当插入你的狙击在我的V.CSPROJ,我没有得到这些消息显示。我得到的只是:错误:找不到进程“VSCompiler.exe”。知道为什么不显示“流程不存在”吗
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Kill" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- List of processes to kill -->
<ItemGroup>
<Process Include="process1.exe" />
</ItemGroup>
<Target Name = "Kill">
<Exec Command="taskkill /F /IM %(Process.Identity)"
IgnoreExitCode="true"
IgnoreStandardErrorWarningFormat="true">
<Output TaskParameter="ExitCode" PropertyName="ErrorCode"/>
</Exec>
<Error Text="Cannot kill process." Condition="$(ErrorCode) == 1"/>
<Message Text="Process does not exist." Condition="$(ErrorCode) == 128"/>
</Target>
</Project>