如果存在msbuild,你如何杀死任务?

时间:2017-07-20 11:59:51

标签: msbuild

需要在msbuild中终止任务,但仅当此任务正在运行时才会执行。

你是怎么做到的?

鉴于我有类似下面的内容,如何修改以仅在运行时终止进程?

    <!-- 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>

非常感谢

1 个答案:

答案 0 :(得分:1)

好的,我会给出答案,因为它不适合评论(不再是)。

这对我有用,因为如果相关进程不存在,它不会导致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>

这是输出:

Microsoft (R) Build Engine version 14.0.25420.1
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 20.07.2017 16:17:57.
Project "D:\Sources\MarGe\marge\Main\foo.proj" on node 1 (Kill target(s)).
Kill:
  taskkill /F /IM Process1.exe
  ERROR: The process "Process1.exe" not found.
  The command "taskkill /F /IM Process1.exe" exited with code 128.
Done Building Project "D:\Sources\MarGe\marge\Main\foo.proj" (Kill target(s)).


Build succeeded.
    0 Warning(s)
    0 Error(s)

是的,实际的taskkill.exe命令&#34;失败&#34;在错误128之后,所有进程都不存在。但是,它不会导致您的构建失败。那是, 它仅供参考。

如果您有其他目标,具体取决于他们将运行的Kill目标。

当然,这也意味着,如果Kill目标确实成功地杀死了有问题的进程,那么你无法确定它是否存在。 因为在这种情况下,错误也会被忽略。

如果您可以忍受,那么在尝试杀死该进程之前无需确定该进程是否存在。

请注意,任何地方都有竞争条件。假设您在删除之前编写了一些代码来检查进程是否存在。该代码会告诉您&#34;是的,该过程存在&#34;,但是当实际的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进程不存在

(有关相关主题,请参阅here。)