Как проверить, существует ли файл в списке элементов с помощью msbuild?

Я хотел бы выполнить задачу если какой-либо файл в списке пункт отсутствует. Как мне это сделать?

в моем текущем скрипте есть список "исходных" файлов @(MyComFiles), которые я перевожу в другой список "целевых" файлов @(MyInteropLibs), используя следующую задачу:

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

Я хочу проверить, отсутствует ли какой-либо из файлов в @(MyInteropLibs), и запустить задачу, которая их создаст.

3 ответов


Я не очень опытен с MSBuild, поэтому могут быть лучшие решения, чем это, но вы можете написать задачу FilesExist, которая принимает список файлов и передает каждый файл в файл.Существует возврат true, если они существуют, и false в противном случае, и thenn реагируют на результат

Извините, я не могу предоставить код, чтобы помочь, мой knowlege MSBuild sytax не силен


Если вам нужно только создать отсутствующие файлы, а не получить список файлов, которые отсутствовали вы можете вы сенсорный задание, который будет создан, если файлы не существуют.

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

Если вы хотите только создать отсутствующие файлы и избежать изменения временных меток существующих файлов, то пакетирование может помочь

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

Если вы хотите список файлов, созданных тогда

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

вы можете узнать довольно легко, используя Exec.

чтобы проверить, существует ли весь набор файлов: команда DOS FOR /D принимает разделенный точкой с запятой список файлов-т. е. плоский массив элементов.

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

чтобы проверить, существует ли какой-либо из набора файлов: команда DOS dir принимает список файлов, разделенных точкой с запятой. Он устанавливает %ERRORLEVEL% в 0, если он находит файлы в списке, ненулевые, если он не находит ни одного. (Это более простой случай, но он делает не ответьте на первоначальный вопрос...)

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

тогда, скорее всего, вы захотите определить логическое свойство на основе вывода.

редактировать: кстати, это запах кода. Обычно, когда вы обнаруживаете, что хотите это сделать, это указывает на то, что вы должны установить свойство Outputs цели, чтобы он зацикливался на элементах.