Nant:按模式查找文件

时间:2010-11-04 10:59:41

标签: nant

我要做的是找到一个带有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 个答案:

答案 0 :(得分:4)

This nantcontrib function will put the matching filenames into a delimited string.

如果你知道只有一个匹配的文件存在,那么它可能会得到你想要的。如果有多个,那么你可以使用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