Wie kann ich überprüfen, ob eine Datei in einer Artikelliste mit msbuild existieren?

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich möchte eine Aufgabe ausgeführt werden soll, wenn eine Datei in einer Artikelliste fehlen. Wie kann ich das tun?

Meine aktuelle Skript hat eine Liste der „Quelle“ Dateien @ (MyComFiles), dass ich eine andere Liste von „Ziel“ Dateien übersetzen @ (MyInteropLibs) unter Verwendung der folgende Aufgabe:

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

Ich möchte überprüfen, ob eine der Dateien in @ (MyInteropLibs) fehlt und eine Aufgabe ausführen, die sie zu schaffen.

War es hilfreich?

Lösung

Ich bin sehr nicht mit MSBuild erlebt so gibt als diese bessere Lösungen sein kann, aber man könnte eine FilesExist Aufgabe schreiben, die die Dateiliste nimmt und übergibt jede Datei File.Exists gibt true zurück, wenn sie existieren und andernfalls false und thenn zu reagieren basierend auf dem Ergebnis

Leider habe ich keinen Code zu helfen, zur Verfügung stellen kann, mein know MSBuild sytax nicht stark

Andere Tipps

Wenn Sie nur die fehlenden Dateien zu erstellen, und nicht eine Liste der Dateien zu erhalten, die fehlten Sie können Sie die Touch Aufgabe , die geschaffen werden, wenn die Dateien nicht existieren.

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

Wenn Sie nur die fehlenden Dateien erstellen möchten, und vermeiden Zeitstempel der vorhandenen Dateien zu ändern, dann kann Dosierung helfen

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

Wenn Sie eine Liste der erstellten Dateien dann

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

Sie können herausfinden, ziemlich leicht Exec.

Um zu testen, ob alle von einer Reihe von Dateien existieren. Das DOS FOR / D-Befehl akzeptiert ein Semikolon getrennte Liste von Dateien - das heißt ein abgeflachtes Element Array

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

Um zu testen, ob eine beliebige einer Reihe von Dateien vorhanden ist: Die DOS DIR-Befehl akzeptiert ein Semikolon getrennte Liste von Dateien. Er setzt das% Error-% auf 0, wenn es alle Dateien in der Liste findet, ungleich Null, wenn es findet keine. (Dies ist der einfachere Fall, aber es funktioniert nicht Adresse die ursprüngliche Frage ...)

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

Dann wird höchstwahrscheinlich wollen Sie eine boolean Eigenschaft definieren basierend auf der Ausgabe.

Bearbeiten : BTW das ist ein Code Geruch. Normalerweise, wenn Sie sich finden zu wollen, dies zu tun, es ist ein Hinweis darauf, dass Sie die Ausgänge Eigenschaft des Ziels gesetzt sollen, so dass es in einer Schleife über die Elemente.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top