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