Come posso verificare se esiste un file in un elenco di elementi usando msbuild?

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

  •  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à.

È stato utile?

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 task , che verrà creato se i file non esistono.

<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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top