2009-04-29 24 views
7

Me gustaría ejecutar una tarea si falta algún archivo en una lista de elementos. ¿Cómo puedo hacer eso?¿Cómo puedo verificar si existe algún archivo en una lista de elementos usando msbuild?

Mi script actual tiene una lista de archivos "fuente" @ (MyComFiles) que traduzco otra lista de archivos "destino" @ (MyInteropLibs), mediante las siguientes tareas:

<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 ejecuta una tarea que los creará.

Respuesta

3

No tengo mucha experiencia con MSBuild, así que puede haber mejores soluciones que esta, pero podría escribir una tarea FilesExist que tome la lista de archivos y pase cada archivo a File.Exists que devuelve true si existen y, en caso contrario, falsen reaccionan en función del resultado

lo siento, no puedo proporcionar el código para ayudar, mi profundo conocimiento de MSBuild sytax no es fuerte

+0

Preferiría hacerlo en msbuild. Es posible usar una función Exists() en el atributo Condicional de una tarea, pero solo funciona en un archivo. –

+2

No parece que MSBuild tenga la funcionalidad incorporada. Tampoco veo dicha funcionalidad en MSBuild Extension Pack o MSBuild Community Tasks. Como sugirió Crippledsmurf, puedes crear tu propia tarea personalizada de MSBuild que hará lo que necesites. A continuación, hace referencia al dll en su archivo de compilación y llama a la tarea según sea necesario. – Pedro

4

Si sólo 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 sólo desea crear los archivos que faltan, y evitar el cambio de marcas de tiempo de los archivos existentes, a continuación, la dosificación puede ayudar

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

Si desea una lista de los archivos creados después

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

Puede encontrarlo fácilmente usando Exec.

Para probar si TODO un conjunto de archivos existe: El comando DOS FOR/D acepta una lista de archivos separados por punto y coma, es decir, un conjunto de elementos aplanados.

<!-- 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 alguna de un conjunto de archivos existe: El comando DOS DIR acepta una lista separada por comas de archivos. Establece% 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 lo hace no dirección de la pregunta original ...)

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

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

EDIT: BTW esto es un olor a código. Por lo general, cuando desee hacer esto, es una indicación de que debe establecer la propiedad de Salidas del objetivo para que pase por encima de los elementos.

Cuestiones relacionadas