删除文件的 MSBuildTask 语法

我正在尝试编写一个 MSBuild Task,它会从我的生产构建脚本的 bin 文件夹中删除 Obj 目录和 PDB,但似乎无法正常工作。

有没有人有这样做的例子或类似的例子,或链接到一个简单的例子,删除文件和目录与 MSBuild?

60078 次浏览

如果要删除整个目录,则需要执行 删除任务:

<RemoveDir Directories="Path/To/Obj" />

如果你想从 bin 中删除 PDB 文件,你需要执行 删除任务:

<Delete Files="Path/To/Bin/MyApp.pdb" />

注意,在 Delete 任务中不能使用通配符,因此如果有多个 pdb 文件,则必须提供一个 项目组作为参数。

您可以先删除这些目录中的文件,然后使用

<Target Name="SomeTarget">
<ItemGroup>
<FilesToDelete Include="Path\To\Obj\**\*"/>
</ItemGroup>
<Delete Files="@(FilesToDelete)" />
<RemoveDir Directories="Path\To\Obj\" />
</Target>

这个密码太难看了,应该附带一个晕机袋。但是它很快,因为它没有建立一个要删除的文件列表等等。

<Target Name="DeleteBuildFolder">
<Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
<Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
<Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
<Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
<Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
<Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
<Exec Command="RmDir /S /Q &quot;$(BuildFolder)&quot;" />
</Target>

需要多少 RmDir 命令?足以让一些 RmDir 命令返回“系统找不到指定的文件”,而不是“目录不是空的”在我的机器上,如果 $(BuildFolder)在文件资源管理器中打开,它似乎需要另一个 RmDir。反病毒程序可能会影响 RmDir,就像它偶尔会做 Subversion 一样,但我宁愿有一个全面的 AV 保护,而不是(错误地)管理一个排除列表。

给其他可能遇到和我一样问题的人发帖子。

Delete 任务不能删除只读文件,我需要能够这样做,因为当 MSBuild 从 TFS 获取最新数据时,这些文件被标记为只读。我使用 EXEC 命令删除只读文件:

<ItemGroup>
<FileToDelete Include="c:\temp\fileToDelete.txt"/>
</ItemGroup>
<Exec Command="del /F /Q &quot;@(FileToDelete)&quot;"/>

还可以首先从文件中删除 readonly 属性并执行 msbuild delete Task。

像这样:

<Target Name="DeleteFiles">
<Message Text="Delete File" Importance="high"/>
<Attrib Files="$(FileToDelete)" ReadOnly="false" />
<Delete Files="$(FileToDelete)" />
</Target>`

在 VisualStudio2013中,将其添加到 my.csproj 文件的结尾 </Project>结束标记之前

<Target Name = "clean_folders" AfterTargets="Clean">
<Exec Command = "rd /S /Q obj" />
<Exec Command = "rd /S /Q bin" />
</Target>

起初它看起来不起作用,但是我注意到 Visual Studio (或者 R # ,不确定)重新添加了 DesignTimeResolveAssemblyReferencesInput.cache到 obj 文件夹,它也重新添加了当前的 \bin文件夹(我在 \bin下的不同子文件夹中有不同的构建)。它清除了所有其他东西,包括我从导入的25个其他构建配置。Csproj 文件(是的,我知道)。

如果您批量重建多个配置,请小心,因为它只是擦除所有以前的努力,每个重建留给您只有最后一个。好极了。

张贴的答案将工作,只要你必须处理一个单一的目录。如果您碰巧有嵌套文件夹,则 RemoveDir将失败,并出现 Directory not empty错误。

一种稍微通用的方法也可以处理嵌套文件夹:

<Target Name="CleanOutDir">
<ItemGroup>
<FilesToClean Include="$(OutDir)\**\*.*" />


<!-- Bit of .Net to get all folders and subfolders -->
<FoldersToClean Include="$([System.IO.Directory]::GetDirectories(&quot;$(OutDir)&quot;))" />
</ItemGroup>


<Delete Files="@(FilesToClean)"/>
<RemoveDir Directories="@(FoldersToClean)" />
</Target>

我又发现了一个问题。我在使用 Visual Studio 2015。通过通配符删除发布的答案对我来说仍然很麻烦。我怀疑通配符是在构建之前计算的,而不是在构建之后.这意味着,如果要删除的文件是在构建期间创建的,则不会进行删除。它还导致了一个非常好的行为,在您构建时每隔一秒删除操作就会工作一次,这使得测试这一切变得非常愉快。

我放弃通配符了。对于我所做的,我知道这些文件是造成麻烦,我硬编码(如果它可以被称为内部的项目文件)的实际文件名。