我想要删除所有的bin和obj文件夹,以便强制所有项目重新构建。

446

我参与多个项目,想要递归删除所有名称为'bin'或'obj'的文件夹,这样我就可以确定所有项目将重新构建(有时这是强制Visual Studio忘记之前所有构建的唯一方法)。

有没有快速实现这一目标的方法(例如使用.bat文件)而无需编写.NET程序?


78
如果 "生成->清理解决方案" 确实这样做,那就太好了。 - Dustin Andrews
1
我发现了一个叫做CleanBinAndObj的插件,它可以删除所有的bin和obj文件夹。对于包含多个项目的单一解决方案非常有效。 - TheLegendaryCopyCoder
30个回答

6

这是我用来递归删除所有BIN和OBJ文件夹的批处理文件。

  1. 创建一个空文件并将其命名为DeleteBinObjFolders.bat
  2. 将以下代码复制粘贴到DeleteBinObjFolders.bat
  3. DeleteBinObjFolders.bat文件移动到与您的解决方案(*.sln)文件相同的文件夹中。
@echo off
@echo Deleting all BIN and OBJ folders...
for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s/q "%%d"
@echo BIN and OBJ folders successfully deleted :) Close the window.
pause > nul

1
我刚把这个脚本放在我的桌面上 - 但在第一行后面添加了一行 cd C:\Git\Workspace... - James S
请注意,/r 优先于 /d,因此名为“bin”和“obj”的文件也可能被删除。FOR 命令具有离散的“模式”。R 和 D 是这些模式的示例,每次只有一个模式处于活动状态。 - Dercsár

6

我使用稍微修改过的Robert H的代码,它会跳过错误并打印删除的文件。通常我还会清除.vs_resharperpackage文件夹:

Get-ChildItem -include bin,obj,packages,'_ReSharper.Caches','.vs' -Force -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse -ErrorAction SilentlyContinue -Verbose}

值得注意的是git命令可以清除所有更改,包括被忽略的文件和目录:
git clean -dfx

git clean -dfx 是完美的。 - Ibrahim ULUDAG
请注意,git clean命令将删除除根存储库之外的所有内容。如果您只想删除bin和obj文件夹,这可能不是您想要的操作。 - nawfal

4

VS 2019/VS 2022 中,这是唯一明智的解决方案。

在解决方案文件夹(即 .sln 文件所在的位置),创建一个名为 Directory.Build.props 的文件,并按下面所示进行编辑。关于这个特殊文件的详细信息可在此处查看

Directory.Build.props

<Project>
  <Target Name="RemoveObjAndBinFolders" AfterTargets="Clean">
    <PropertyGroup>
      <ObjFolder>$(ProjectDir)$(BaseIntermediateOutputPath)</ObjFolder>
      <BinFolder>$(ProjectDir)$(BaseOutputPath)</BinFolder>

      <!-- Microsoft.NET.Sdk.Web sets $(BaseIntermediateOutputPath) to -->
      <!-- an absolute path. Not fixed up to MsBuild 17! -->
      <BaseIntermediateOutputPathFix Condition="$(BaseIntermediateOutputPath.StartsWith($(MSBuildProjectDirectory)))">$([MSBuild]::MakeRelative(
        $(ProjectDir),
        $(BaseIntermediateOutputPath)
      ))</BaseIntermediateOutputPathFix>
    
      <ObjFolder Condition="$(BaseIntermediateOutputPath.StartsWith($(MSBuildProjectDirectory)))">$(ProjectDir)$(BaseIntermediateOutputPathFix)</ObjFolder>
    </PropertyGroup>

    <ItemGroup>
      <ObjFiles Include="$(ObjFolder)/*.*"
                Exclude="$(ObjFolder)/project.assets.json" />
      <ObjSubFolders
                Include="$([System.IO.Directory]::GetDirectories('$(ObjFolder)'))" />
    </ItemGroup>
    
    <!-- Remove "obj" sub folders -->
    <RemoveDir Directories="@(ObjSubFolders)" ContinueOnError="true" />
    <!-- Remove "obj" files (keeping necessary asset file)-->
    <Delete Files="@(ObjFiles)" />
    
    <!-- Remove "bin" folders -->
    <RemoveDir Directories="$(BinFolder)" ContinueOnError="true" />
  </Target>
</Project>

无需修改大量的 .csproj 文件。同时请注意,我并未像一些人建议的那样删除 $(TargetDir)。如果 $(OutDir) 已经设置为某个自定义目录(常见做法),这样做可能会瘫痪构建系统。

1
需要注意的是,这个解决方案有时会干扰VS,导致它抱怨缺少project.assets.json。我已经在我的解决方案中停用了它。需要进行一些改进。 - l33t

4

以上几个解决方案提供了如何排除文件夹的答案,但不是在cmd中。 以下是对Steve Willcock的答案进行扩展,以排除例如node_modules文件夹,该文件夹可能包含其中的bin文件夹,可以使用下面扩展的一行代码。

FOR /F "tokens=*" %G IN ('DIR /B /AD /S bin obj ^|find ^"node_modules^" /v /i') DO RMDIR /S /Q "%G"

正如其他人所指出的,在将上述命令放入cmd脚本中并且不直接在命令行中使用时,请用%%G替换%G

将程序代码中的 %G 替换为 %%G - Louis Somers

3

这里是我对类似问题的回答。简单易懂,效果不错,而且不需要除了 Visual Studio 外的任何其他东西。

正如其他人已经回答的那样,Clean 将删除构建生成的所有工件,但会留下其他一些东西。

如果您在 MSBuild 项目中进行了一些自定义操作,这可能会带来麻烦,并留下应该被删除的东西。

您可以通过在 .*proj 中添加以下内容来解决此问题:

<Target Name="SpicNSpan"
        AfterTargets="Clean">
    <RemoveDir Directories="$(OUTDIR)"/>
</Target>

这将删除当前平台/配置下bin文件夹中的所有内容。


3

3

请查看CleanProject,它可以删除bin文件夹、obj文件夹、TestResults文件夹和Resharper文件夹。源代码也是可用的。


该项目似乎已经移至此处:https://code.msdn.microsoft.com/windowsdesktop/Clean-Cleans-Visual-Studio-a05bca4f - Johny Skovdal

2

我其实很讨厌在源代码树中到处都是obj文件。我通常会设置项目,使它们将obj文件输出到源代码树之外。对于C#项目,我通常使用

 <IntermediateOutputPath>..\..\obj\$(AssemblyName)\$(Configuration)\</IntermediateOutputPath>

对于 C++ 项目

 IntermediateDirectory="..\..\obj\$(ProjectName)\$(ConfigurationName)"

2
在Visual Studio中,我有一个很好的自定义命令,可以在解决方案上运行:
  1. 从“工具”->“外部工具”创建一个外部工具,如下所示:

Visual Studio external tools dialog

命令:cmd.exe

参数:/c "for /d /r . %d in (bin,obj) do @if exist "%d" rd /s/q "%d""

初始目录:$(SolutionDir)

  1. 将该命令添加到解决方案上下文菜单中。

右键单击工具栏,选择自定义按钮:

Visual Studio Commands Customize Menu

添加一个新命令并选择正确的外部命令(在我的情况下是第六个外部命令):

Visual Studio Commands Dialog

  1. 享受吧!

1

http://vsclean.codeplex.com/

一个命令行工具,可以查找 Visual Studio 解决方案并在其上运行 Clean 命令。这使您可以清理硬盘上所有旧项目的 /bin/* 目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接