需要在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>
非常感谢
答案 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
的常见(可能?)退出代码似乎是:
(有关相关主题,请参阅here。)