我如何看待当前的';步骤';是否通过MSBuild中的自定义记录器对项目列表执行任务?

我如何看待当前的';步骤';是否通过MSBuild中的自定义记录器对项目列表执行任务?,msbuild,msbuild-task,Msbuild,Msbuild Task,我为不知道如何正确表达我的需要而提前道歉,因此我将尝试更详细地解释这一点: 我们正在使用MSBuild构建一个自动化部署过程。我们的软件安装程序需要在我们环境中的某些机器上多次运行,因为我们必须设置单独的实例。我们这样做的方式是通过创建任务的“列表”(如果这是正确的术语,变量,如@(name)),用元数据描述要运行的安装、要运行的实例以及在哪台机器上运行,然后循环所有这些任务。此外,我们正在以同步方式关闭和重新启动服务 从本质上讲,我们的问题在于,为了日志记录器的目的,我们希望将故障分离出来,并

我为不知道如何正确表达我的需要而提前道歉,因此我将尝试更详细地解释这一点:

我们正在使用MSBuild构建一个自动化部署过程。我们的软件安装程序需要在我们环境中的某些机器上多次运行,因为我们必须设置单独的实例。我们这样做的方式是通过创建任务的“列表”(如果这是正确的术语,变量,如@(name)),用元数据描述要运行的安装、要运行的实例以及在哪台机器上运行,然后循环所有这些任务。此外,我们正在以同步方式关闭和重新启动服务

从本质上讲,我们的问题在于,为了日志记录器的目的,我们希望将故障分离出来,并将它们限制在特定的实例中。当发出警告时,是否有任何方式将当前任务的属性公开给记录器?理想情况下(对于任何用途),它将是后解析,因此如果属性为:

<Exec Command="install%(InstanceName.ShortName).bat" />


我们可以在记录器中查看该属性并查看它当前是否正在运行“installfoo.bat”?

您描述的功能称为批处理。如果我正确地阅读了您的问题,那么您希望能够在发生错误或其他事件时记录构建所基于的批处理

查看
ILogger
界面,我认为这是不可能的-只有任务知道传递给它的是哪批项目。我猜您希望对一系列不同的内置任务执行此操作,因此一种解决方法是将任务包装到一个目标中,您可以在其中记录任何您喜欢的内容

<Project xmlns=...>
    <Target Name="Build">
        <ItemGroup>
            <InstanceName Include="Foo Instance">
                <ShortName>foo</ShortName>
            </InstanceName>
            <InstanceName Include="Bar Instance">
                <ShortName>bar</ShortName>
            </InstanceName>
        </ItemGroup>

        <MSBuild Projects="$(MSBuildProjectFile)"
                 Targets="BatchedExec"
                 Properties="CurrentInstance=%(InstanceName.Identity);
                     CurrentShortName=%(ShortName)">
        </MSBuild>
    </Target>

    <Target Name="BatchedExec">
        <Message Text="CurrentInstance: $(CurrentInstance)" />
        <Message Text="CurrentShortName: $(CurrentShortName)" />

        <Exec Command="install$(CurrentShortName).bat">
            <Output TaskParameter="ExitCode" PropertyName="ExitCode"/>
        </Exec>

        <Message Text="install$(CurrentShortName).bat exited with code $(ExitCode)." />
    </Target>
</Project>

福
酒吧
在本例中,将为每个批调用
BatchedExec
目标,您可以在调用任务之前记录您喜欢的任何信息。对于要使用批处理参数运行的每个任务,您都会制定类似的目标