如何在msbuild目标中获取进程id

如何在msbuild目标中获取进程id,msbuild,Msbuild,如何在目标中获取msbuild进程的进程id?我想把它读出来写出来 或者,MSBuild是否具有某种可以捕获的会话id 我想在每次构建运行时只运行一次T4任务,并考虑一种有条件的构建方法。否则它会运行多次 <TransformOnBuild>false</TransformOnBuild> <TransformOnBuild Condition="'$(SomeCondition)' == 'true'">false</TransformOnBuild&

如何在目标中获取msbuild进程的进程id?我想把它读出来写出来

或者,MSBuild是否具有某种可以捕获的会话id

我想在每次构建运行时只运行一次T4任务,并考虑一种有条件的构建方法。否则它会运行多次

<TransformOnBuild>false</TransformOnBuild>
<TransformOnBuild Condition="'$(SomeCondition)' == 'true'">false</TransformOnBuild>
false
假的

如果希望在将某个对象包装到目标中后运行该对象,那么无论调用了多少次,MSBuild都不会执行同一个目标两次。如果您想要一个简单的互斥锁,您可以使用通常的锁文件技术,使用内置的
WriteLinesToFile
Delete
任务以及
InitialTargets
。如果需要实际的进程id,即正在执行任务的(多个)MSBuild节点,可以编写一个内联任务,请参见下面的示例

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask TaskName="Process" TaskFactory="CodeTaskFactory" AssemblyName="Microsoft.Build.Tasks.v12.0">
    <ParameterGroup>
      <Id ParameterType="System.Int32" Output="true" />
    </ParameterGroup>
    <Task>
      <Code>Id = System.Diagnostics.Process.GetCurrentProcess().Id;</Code>
    </Task>
  </UsingTask>

  <Target Name="Foo">
    <Process>
      <Output PropertyName="Id" TaskParameter="Id" />
    </Process>
    <Message Text="Process $(Id)" />
  </Target>
</Project>

请重新表述您的问题(基本上,您的最后一段是q,其余部分是您考虑的可能的解决方案,可能无论如何都不会奏效),并添加更多信息:您的“每次构建一次”是什么意思?您是否正在构建一个包含多个项目的解决方案,并且希望只运行一次任务?或者您正在使用自定义生成文件?还是别的什么?现在每个项目都定义了目标吗?或者为什么它会运行多次?