¿Cómo verifico si existe algún archivo en una lista de elementos usando msbuild?

StackOverflow https://stackoverflow.com/questions/802070

  •  03-07-2019
  •  | 
  •  

Pregunta

Me gustaría ejecutar una tarea si falta algún archivo en una lista de elementos. ¿Cómo hago eso?

Mi script actual tiene una lista de " fuente " archivos @ (MyComFiles) que traduzco otra lista de " destino " archivos @ (MyInteropLibs), usando la siguiente tarea:

<CombinePath BasePath="$(MyPath)\interop" 
             Paths="@(MyComFiles->'%(filename).%(extension)')">
    <Output TaskParameter="CombinedPaths" 
            ItemName="MyInteropLibs" />
</CombinePath>

Quiero comprobar si falta alguno de los archivos en @ (MyInteropLibs) y ejecutar una tarea que los cree.

¿Fue útil?

Solución

No tengo mucha experiencia con MSBuild, por lo que puede haber mejores soluciones que esta, pero podrías escribir una tarea de FilesExist que tome la lista de archivos y pase cada archivo a File.Exists devuelve true si existen y false de lo contrario y luego reacciona basado en el resultado

Lo siento, no puedo proporcionar el código para ayudar, mi conocimiento de SyBax de MSBuild no es sólido

Otros consejos

Si solo necesita crear los archivos que faltan, y no obtener una lista de los archivos que faltaban, puede touch task , que se creará si los archivos no existen.

<Touch Files="@(MyInteropLibs)" AlwaysCreate="True" />

Si solo desea crear los archivos que faltan, y evitar cambiar las marcas de tiempo de los archivos existentes, el proceso por lotes puede ayudar

<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True" 
       Condition=" ! Exists(%(MyInteropLibs.FullPath)) "/>

Si quieres una lista de los archivos creados entonces

<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True" 
       Condition=" ! Exists(%(MyInteropLibs.FullPath)) ">
    <Output TaskParameter="TouchedFiles" ItemName="CreatedFiles"/>
</Touch>
<Message Text="Created files = @(CreatedFiles)"/>

Puedes descubrirlo fácilmente usando Exec.

Para comprobar si existe TODO un conjunto de archivos: el comando DOS FOR / D acepta una lista de archivos separados por punto y coma, es decir, una matriz de elementos aplanada.

<!-- All exist -->
<Exec
  Command="for /D %%i in (@(MyFiles)) do if not exist %%i exit 1"
  IgnoreExitCode="true">
  <Output TaskParameter="ExitCode" PropertyName="ExistExitCode"/>
</Exec>

Para probar si existe CUALQUIERA de un conjunto de archivos: El comando DIR de DOS acepta una lista de archivos separados por punto y coma. Establece el% ERRORLEVEL% en 0 si encuentra algún archivo en la lista, distinto de cero si no encuentra ninguno. (Este es el caso más simple, pero no aborda la pregunta original ...)

<!-- Any exists -->
<Exec Command="dir /B @(MyFiles)" IgnoreExitCode="true">
  <Output TaskParameter="ExitCode" PropertyName="DirExitCode"/>
</Exec>

Entonces lo más probable es que desees definir una propiedad booleana basada en la salida.

EDIT : Por cierto, este es un olor a código. Por lo general, cuando tiene ganas de hacer esto, es una indicación de que debe establecer la propiedad Outputs del objetivo para que se repita en los elementos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top