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