如何仅在msbuild存在时终止任务

如何仅在msbuild存在时终止任务,msbuild,Msbuild,需要终止msbuild中的任务,但仅当此任务正在运行时 你是怎么做到的 如果我有下面这样的内容,我如何修改以仅在运行时终止进程 <!-- List of processes to kill --> <ItemGroup> <Process Include="Process1.exe" /> </ItemGroup> <Target Name = "Kill"> <Exec Comm

需要终止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>


非常感谢

好的,我会回答这个问题,因为它不再适合评论了

以下是对我有效的方法,因为如果所讨论的进程不存在,它不会导致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>