Comment vérifier si un fichier dans une liste d'éléments existe à l'aide de msbuild?

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

  •  03-07-2019
  •  | 
  •  

Question

Je souhaite exécuter une tâche si l'un des fichiers de la liste des éléments est manquant. Comment je fais ça?

Mon script actuel contient une liste de " source " fichiers @ (MyComFiles) que je traduis une autre liste de " destination " files @ (MyInteropLibs), à l'aide de la tâche suivante:

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

Je veux vérifier si l'un des fichiers de @ (MyInteropLibs) est manquant et exécuter une tâche qui les créera.

Était-ce utile?

La solution

Je ne suis pas très familiarisé avec MSBuild. Il peut donc exister de meilleures solutions, mais vous pouvez écrire une tâche FilesExist qui prend la liste de fichiers et transmet chaque fichier à File.Exists en renvoyant la valeur true si elle existe et la valeur false sinon, puis en réagissant. basé sur le résultat

Désolé, je ne peux pas fournir de code pour vous aider, ma connaissance de MSBuild sytax n’est pas solide

Autres conseils

Si vous devez uniquement créer les fichiers manquants et ne pas obtenir la liste des fichiers manquants, vous pouvez utiliser le tâche tactile , qui sera créée si les fichiers n’existent pas.

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

Si vous souhaitez uniquement créer les fichiers manquants et éviter de modifier l'horodatage des fichiers existants, le traitement par lots peut vous aider

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

Si vous voulez une liste des fichiers créés, alors

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

Vous pouvez le découvrir assez facilement avec Exec.

Pour vérifier si TOUT d'un ensemble de fichiers existe: La commande DOS FOR / D accepte une liste de fichiers séparés par des points-virgules - c'est-à-dire un tableau d'éléments aplatis.

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

Pour vérifier si AUCUN des fichiers n’existe: La commande DOS DIR accepte une liste de fichiers séparés par des points-virgules. Il définit% ERRORLEVEL% sur 0 s'il trouve des fichiers dans la liste, différent de zéro s'il n'en trouve aucun. (C’est le cas le plus simple, mais cela ne répond pas à la question initiale ...)

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

Ensuite, vous souhaiterez probablement définir une propriété booléenne en fonction du résultat.

MODIFIER : BTW, il s'agit d'une odeur de code. Habituellement, lorsque vous avez envie de le faire, cela signifie que vous devez définir la propriété Outputs de la cible pour qu'elle passe en boucle sur les éléments.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top