Usando MSBuild para comprimir múltiples directorios de proyectos

Como parte de mi proceso de compilación en MSBuild 4.0, termino con la siguiente estructura de directorios:

\OutDir
    \ProjectA
      \File1.dll  
      \File2.dll  
      \File3.exe
    \ProjectB
      \Subfolder1
        File4.html
      \File5.dll  
      \File6.dll  
      \File7.exe
    \ProjectC
      \File8.dll  
      \File9.exe

Quiero poder crear un archivo zip por subcarpeta de\OutDir. Si hago lo siguiente:

<ItemGroup>
  <ZipSource Include="\OutDir\**.*" />
</ItemGroup>

<MSBuild.Community.Tasks.Zip
  Files="@(ZipSource)"
  ZipFileName="OutDir\%(ZipSource.RecursiveDir)ZippedOutput.zip"
  WorkingDirectory="OutDir" />

entonces cada subcarpeta se comprime recursivamente, lo que funciona bien para ProjectA y ProjectC, pero ProjectB termina con dos archivos zip, uno de su nivel raíz y uno de su subcarpeta.

Mi otro requisito es que el archivo de compilación no conoce la cantidad de proyectos, por lo que no puedo simplemente crear un ItemGroup y enumerar los proyectos que quiero comprimir.

Esta tarea sería fácil en NAnt a través de su tarea foreach, pero ¿cómo puedo lograr esto en MSBuild, preferiblemente sin recurrir a tareas personalizadas?

Respuestas a la pregunta(2)

Su respuesta a la pregunta