¿Cómo obtengo una tarea msbuild para hacer transformaciones de configuración en una colección de archivos?

Estoy tratando de transformar todos los archivos web.config en un proyecto que tengo, aquí está mi estructura de árbol:

Transform.batTransformaConfigTransform.projWeb.Transform.configSitio webweb.configPuntos de vistaweb.config

Hay más archivos web.config, pero la idea es que esto los encontrará todos y aplicará la misma transformación de configuración en ellos.

He tomado algunos consejos deuna entrada de blog que encontré Pero me quedo atascado en el último paso, la transformación real. También hay una parte un tanto ruda en el medio que realmente no me gusta (no entiendo muy bien lo que estoy haciendo y obviamente lo estoy haciendo mal). Aquí es donde estoy hasta ahora:

<code><Project ToolsVersion="4.0" DefaultTargets="Transform" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="TransformXml" AssemblyFile="Tools\Microsoft.Web.Publishing.Tasks.dll"/>

    <PropertyGroup>
        <SitePath>..\..\Website</SitePath>
        <WebConfigTransformInputFile>$(SitePath)\Web.config</WebConfigTransformInputFile>
        <WebConfigTransformFile>Web.Transform.config</WebConfigTransformFile>
        <OutDir>..\N\N\</OutDir>

    </PropertyGroup>

    <ItemGroup>
        <_FilesToTransform Include="$(SitePath)\**\web.config"/>
    </ItemGroup>

    <Target Name="Transform">

    <MakeDir Directories="@(_FilesToTransform->'$(OutDir)%(RelativeDir)')" />

    <TransformXml Source="@(_FilesToTransform->'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')"
                  Transform="$(WebConfigTransformFile)"
                  Destination="@(_FilesToTransform->'$(OutDir)%(RelativeDir)%(Filename)%(Extension)')" />
    </Target>
</Project>
</code>

Mi Transform.bat se ve así:

<code>%systemroot%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe %CD%\Transforms\ConfigTransform.proj
</code>

Así que cuando llamo al lote, se crean los directorios apropiados. Sin embargo, como puede ver, he tenido que ser un poco creativo con OutDir, por lo que es .. \ N \ N. Por alguna razón, si no hago esto, la ruta OutDir será exactamente la misma que la del directorio de entrada. Así que obviamente necesito cambiar algo en MakeDir pero no estoy seguro de qué.

El verdadero problema viene cuando comienza a hacer las transformaciones. He intentado mantener el parámetro TransformXml Source de esta manera o similar:

<code>@(_FilesToTransformNotAppConfig->'%(FullPath)')
</code>

Este último me da un error "No se pudo abrir el archivo de origen: el formato de la ruta de acceso no es compatible". y el primero me da esta salida:

<code>Build started 30-4-2012 14:02:48.
Project "D:\Dev\transform\DoTransforms\Transforms\ConfigTransform.proj" on node 1 (default targets).
Transform:
  Creating directory "..\N\N\..\..\Website\Views\".
  Transforming Source File: ..\N\N\..\..\Website\Views\Web.config;..\N\N\..\..\Website\Web.config
D:\Dev\transform\DoTransforms\Transforms\ConfigTransform.proj(32,2): error : Could not open Source file: Could not find a part of the path 'D:\Dev\transform\DoTransforms\Website\Views\Web.config;\Website\Web.config'.
  Transformation failed
Done Building Project "D:\Dev\transform\DoTransforms\Transforms\ConfigTransform.proj" (default targets) -- FAILED.

Build FAILED.
</code>

Para resumir mis preguntas:

¿Cómo evito el problema de ruta para OutDir? He jugado con varios caminos pero no puedo hacerlo bien.¿Cómo consigo que la tarea TransformXml acepte varios archivos en el atributo Fuente?

Respuestas a la pregunta(1)

Su respuesta a la pregunta