2009-02-04 16 views
22

Tengo una situación en la que necesito copiar algunos archivos específicos en un script de MSBuild, pero pueden o no existir. Si no existen está bien, no los necesito entonces. Pero la tarea estándar <copy> arroja un error si no puede encontrar todos y cada uno de los elementos en la lista ...MSBuild: ¿cómo copiar archivos que pueden existir o no?

Respuesta

39

Utilice existe la condición en la tarea Copiar.

<CreateItem Include="*.xml"> 
    <Output ItemName="ItemsThatNeedToBeCopied" TaskParameter="Include"/> 
</CreateItem> 

<Copy SourceFiles="@(ItemsThatNeedToBeCopied)" 
     DestinationFolder="$(OutputDir)" 
     Condition="Exists('%(RootDir)%(Directory)%(Filename)%(Extension)')"/> 
+1

Gracias! ¡Me había olvidado de estos! :) –

+7

También vale la pena mencionar que en lugar de '% (RootDir)% (Directorio)% (Filename)% (Extension)', uno simplemente puede usar '% (FullPath)' (vea http://msdn.microsoft. com/en-us/library/ms171476.aspx) – AASoft

+0

Tenga en cuenta que cuando utiliza transformación al proporcionar 'SourceFiles', debe proporcionar la misma transformación exacta en' Condition' – patryk

5

Lo más fácil sería utilizar la bandera ContinueOnError http://msdn.microsoft.com/en-us/library/7z253716.aspx

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
     <MySourceFiles Include="a.cs;b.cs;c.cs"/> 
    </ItemGroup> 

    <Target Name="CopyFiles"> 
     <Copy 
      SourceFiles="@(MySourceFiles)" 
      DestinationFolder="c:\MyProject\Destination" 
      ContinueOnError="true" 
     /> 
    </Target> 

</Project> 

Pero si algo más es incorrecto que no se note. Entonces la condición existe de la respuesta de Madgnome sería mejor.

0

Parece que puede marcar MySourceFiles como SkipUnchangedFiles = "true" y no copiará los archivos si ya existen.

Cuestiones relacionadas