用于删除文件的MSBuild任务语法

我试图编写一个MSBuild任务,从我的生产构build脚本中的我的bin文件夹中删除Obj目录和PDB,似乎无法让它正常工作。

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

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

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

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

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

请注意,您不能在删除任务中使用通配符,因此如果您有多个pdb文件,则必须提供一个ItemGroup作为参数。

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

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

为其他人发帖可能遇到了我遇到的同样的问题。

删除任务不能删除只读文件,这是我需要做的,因为当MSBuild从TFS获得最新版本时,这些文件被标记为只读文件。 我使用EXEC命令来删除只读文件:

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

这个代码是如此丑陋,它应该与一个晕机袋。 ;-)但速度很快,因为它不会build立要删除的文件列表等

 <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> 

需要多less个RmDir命令? 足够多的RmDir命令返回“系统找不到指定的文件”而不是“目录不为空”。 在我的机器上,如果$(BuildFolder)在Windows资源pipe理器中打开,似乎需要另一个RmDir。 防病毒程序可能会影响RmDir,就像它偶尔会出现Subversion一样,但我宁愿拥有全面的AV保护,也不愿意pipe理排除列表。

也可以先从文件中删除只读属性并执行msbuild删除任务。

像这样:

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

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

 <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下build立不同的子文件夹)。 它清除了其他一切,包括我从导入的.csproj文件(是的,我知道)的其他25个构buildconfiguration。

要小心,如果你批量重build多个configuration,因为它只是抹去所有以前的努力,每个重build离开你只有最后一个。 Whups。

只要您需要处理单个目录,发布的答案就可以工作。 如果碰巧有嵌套的文件夹, 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.通过通配符删除已发布的答案仍然是我的麻烦。 我怀疑通配符在构build之前进行了评估,而不是在之后 。 这意味着如果要删除的文件是在构build过程中创build的,则不会发生删除操作。 这也导致了你每次build立的删除工作的美妙行为,这使得这一切都非常愉快的testing。

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