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

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

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Извините, я не могу предоставить код, который мог бы помочь, мои знания 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 целевого объекта, чтобы оно выполняло цикл по элементам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top