Как проверить, существует ли какой-либо файл в списке элементов с помощью msbuild? - PullRequest
7 голосов
/ 29 апреля 2009

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 29 апреля 2009

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

<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)"/>
3 голосов
/ 29 апреля 2009

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

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

1 голос
/ 31 октября 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...