如何:使用通配符生成目录中的所有文件

更新:2007 年 11 月

如果生成的项目中包含多个文件,则可以在项目文件中分别列出每个文件,也可以使用通配符将一个目录或一组嵌套目录中的所有文件都包括进去。

指定输入

项表示某个生成的输入。有关项的更多信息,请参见 MSBuild 项

若要包括某个生成的文件,必须在 MSBuild 项目文件的项集合中包括这些文件。逐个包括文件或使用通配符同时包括许多文件,便可以将多个文件添加到项集合中。

逐个声明各个项

  • 使用 Include 属性,如下所示:

    <CSFile Include="form1.cs"/>
    

    - 或 -

    <VBFile Include="form1.vb"/>
    
    说明:

    如果项集合中的某个项并不位于项目文件所在目录中,则必须指定该项的完整路径或相对路径。例如:Include="..\..\form2.cs"。

声明多个项

  • 使用 Include 属性,如下所示:

    <CSFile Include="form1.cs;form2.cs"/>
    

    - 或 -

    <VBFile Include="form1.vb;form2.vb"/>
    

使用通配符指定输入

还可以使用通配符以递归方式将子目录中的所有文件或某些特定文件包括在某个生成的输入列表中。下面的示例基于一个项目,该项目包含下列目录和子目录中的图形文件,项目文件在 Project 目录中:

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

包括 Images 目录和子目录中的所有 .jpg 文件

  • 使用下面的 Include 属性:

    Include="Images\\**\*.jpg"
    

包括所有以“img”开头的 .jpg 文件

  • 使用下面的 Include 属性:

    Include="Images\**\img*.jpg"
    

包括名称以“jpgs”结尾的目录中的所有文件

  • 使用下列 Include 属性之一:

    Include="Images\**\*jpgs\*.*"
    

    - 或 -

    Include="Images\**\*jpgs\*"
    

将项传递给任务

在项目文件中,可以在任务中使用 @() 表示法指定整个项集合作为某个生成的输入。无论是分别列出所有文件还是使用通配符,都可以使用此表示法。

使用所有 Visual C# 或 Visual Basic 文件作为输入

  • 使用 Include 属性,如下所示:

    <CSC Sources="@(CSFile)">...</CSC>
    

    - 或 -

    <VBC Sources="@(VBFile)">...</VBC>
    
说明:

对项来说,必须使用通配符来指定某个生成的输入,不能使用 MSBuild 任务(如 CscVbc)中的 Sources 属性来指定输入。下面的示例在项目文件中无效:

<CSC Sources="*.cs">...</CSC>

示例

下面的代码示例显示的项目分别包括所有输入文件。

<Project DefaultTargets="Compile"
    xmlns="https://schemas.microsoft.com/developer/msbuild/2003" >
    <PropertyGroup>
        <Builtdir>built</Builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="Form1.cs"/>
        <CSFile Include="AssemblyInfo.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>

下面的代码示例使用通配符来包括所有 .cs 文件。

<Project DefaultTargets="Compile"
    xmlns="https://schemas.microsoft.com/developer/msbuild/2003" >

    <PropertyGroup>
        <builtdir>built</builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="*.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>

请参见

任务

如何:在一个目录中生成所有文件,只有一个文件除外

概念

MSBuild 项