Nant: поиск файлов по шаблону - PullRequest
2 голосов
/ 04 ноября 2010

Я пытаюсь найти файл с помощью NAnt. Этот файл может находиться в любом месте структуры каталогов данной папки.

Я пытался сделать это с помощью задачи NAnt-foreach (это работает), но я не совсем уверен в этом:

<target name="find-file">
    <fail message="Property param.dir must be set" unless="${property::exists('param.dir')}" />
    <fail message="Property param.pattern must be set" unless="${property::exists('param.pattern')}" /> 

    <property name="return.file" value="" />
    <foreach item="File" property="iterator.file">
        <in>
            <items>
                <include name="${param.dir}\**\${param.pattern}" />
            </items>
        </in>
        <do>
            <property name="return.file" value="${iterator.file}" if="${string::get-length(return.file) == 0}" />
        </do>
    </foreach>
</target>

Кто-нибудь знает о лучшем подходе? Если нет, то как мне выполнить выход из цикла foreach после того, как найден первый элемент?

1 Ответ

4 голосов
/ 17 ноября 2010

Эта функция nantcontrib поместит соответствующие имена файлов в строку с разделителями. .

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

Следующий скрипт nant:

<?xml version="1.0" encoding="utf-8"?>
<project default="find-file2">

    <property name="NantContrib.dir" value="C:\Program Files\nantcontrib-0.85\" readonly="true" />

    <target name="LoadNantContrib">
        <loadtasks assembly="${NantContrib.dir}bin\NAnt.Contrib.Tasks.dll" />
    </target>

    <target name="find-file2" depends="LoadNantContrib">
        <fileset id="find.set">
            <include name="${param.dir}\**\${param.pattern}" />
        </fileset>
        <property name="return.file" value="${fileset::to-string('find.set', ' | ')}" />
        <echo message="return.file=${return.file}"/>
        <echo message="Found ${fileset::get-file-count('find.set')} files"/>
    </target>
</project>

... и следующая структура папок:

\---folderroot
    +---folder1
    |       dontfindme.txt
    |       findme.txt
    |       
    +---folder2
    |       dontfindme.txt
    |       
    \---folderempty

... работает как положено. Поиск findme.txt находит один файл. Поиск dontfindme.txt находит два файла. Поиск * .txt находит три файла.

Пример вызова:

nant -D:param.dir=folderroot -D:param.pattern=findme.txt

Пример вывода:

find-file2:

     [echo] return.file=C:\Documents and Settings\rbaker\My Documents\nantfindfile\folderroot\folder1\findme.txt
     [echo] Found 1 files

BUILD SUCCEEDED
...