3

我可以在不编写自己的代码的情况下从 MSBuild 脚本中找出一组文件的大小吗?

MSBuild 本身有一些关于单个项目的元数据(例如,在 %(ModifiedTime) 的最后修改时间),但没有大小。我在http://msbuildextensionpack.com/上看不到任何东西。

编辑:根据 Seva 的回答,这是一个内联任务,它返回项目数组的总大小:

<UsingTask TaskName="GetFileSize" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  <ParameterGroup>
    <Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
    <TotalSize ParameterType="System.Int64" Output="true"/>
  </ParameterGroup>
  <Task>
    <Using Namespace="System.IO"/>
    <Code Type="Fragment" Language="cs"><![CDATA[
        long l = 0;
        foreach (var item in Files) {
            var fi = new FileInfo(item.ItemSpec);
            l += fi.Length;
        }
        TotalSize = l;
]]></Code>
  </Task>
</UsingTask>
4

1 回答 1

5

您实际上可以使用内联任务在 msbuild 项目中使用 .Net API 的子集。

例如,以下打印出单个文件的文件大小:

<UsingTask TaskName="GetFileSize" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  <ParameterGroup>
    <FileName Required="true" />
    <FileSize ParameterType="System.Int64" Output="true"/>
  </ParameterGroup>
  <Task>
    <Using Namespace="System.IO"/>
    <Code Type="Fragment" Language="cs"><![CDATA[
FileInfo fi = new FileInfo(FileName);
FileSize = fi.Length;
]]></Code>
  </Task>
</UsingTask>

<Target Name="PrintFileSize" >
  <GetFileSize FileName="$(MyFileName)">
    <Output TaskParameter="FileSize" PropertyName="MyFileSize" />
  </GetFileSize>
  <Message Text="file size of $(MyFileName) is $(MyFileSize)" />
</Target>
于 2012-08-20T15:13:00.540 回答