Come posso verificare se esiste un file in un elenco di elementi usando msbuild?
-
03-07-2019 - |
Domanda
Vorrei eseguire un'attività se manca un file in un elenco di elementi. Come posso farlo?
Il mio attuale script ha un elenco di " source " file @ (MyComFiles) che traduco un altro elenco di " destinazione " files @ (MyInteropLibs), utilizzando la seguente attività:
<CombinePath BasePath="$(MyPath)\interop"
Paths="@(MyComFiles->'%(filename).%(extension)')">
<Output TaskParameter="CombinedPaths"
ItemName="MyInteropLibs" />
</CombinePath>
Voglio verificare se manca uno dei file in @ (MyInteropLibs) ed eseguire un'attività che li creerà.
Soluzione
Non ho molta esperienza con MSBuild, quindi potrebbero esserci soluzioni migliori di questa, ma potresti scrivere un'attività FilesExist che prende l'elenco dei file e passa ogni file a File. Esiste restituendo vero se esistono e falso altrimenti e quindi non reagisce in base al risultato
Spiacente, non posso fornire il codice per dare una mano, la mia conoscenza della sintassi di MSBuild non è forte
Altri suggerimenti
Se devi solo creare i file mancanti e non ottenere un elenco dei file mancanti, puoi <
<Touch Files="@(MyInteropLibs)" AlwaysCreate="True" />
Se desideri solo creare i file mancanti ed evitare di modificare i timestamp dei file esistenti, il batch può aiutare
<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True"
Condition=" ! Exists(%(MyInteropLibs.FullPath)) "/>
Se vuoi un elenco dei file creati, allora
<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True"
Condition=" ! Exists(%(MyInteropLibs.FullPath)) ">
<Output TaskParameter="TouchedFiles" ItemName="CreatedFiles"/>
</Touch>
<Message Text="Created files = @(CreatedFiles)"/>
Puoi scoprirlo abbastanza facilmente usando Exec.
Per verificare l'esistenza di TUTTI i set di file: il comando DOS FOR / D accetta un elenco di file separato da punto e virgola, ovvero un array di elementi appiattito.
<!-- All exist -->
<Exec
Command="for /D %%i in (@(MyFiles)) do if not exist %%i exit 1"
IgnoreExitCode="true">
<Output TaskParameter="ExitCode" PropertyName="ExistExitCode"/>
</Exec>
Per verificare l'esistenza di QUALSIASI set di file: il comando DOS DIR accetta un elenco di file separato da punto e virgola. Imposta% ERRORLEVEL% su 0 se trova dei file nell'elenco, diverso da zero se non ne trova nessuno. (Questo è il caso più semplice, ma non affronta la domanda originale ...)
<!-- Any exists -->
<Exec Command="dir /B @(MyFiles)" IgnoreExitCode="true">
<Output TaskParameter="ExitCode" PropertyName="DirExitCode"/>
</Exec>
Quindi molto probabilmente vorrai definire una proprietà booleana in base all'output.
MODIFICA : A proposito, questo è un odore di codice. Di solito, quando ti accorgi di voler fare ciò, è un'indicazione che dovresti impostare la proprietà Output del target in modo che si sovrapponga agli elementi.