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

446

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

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


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

1
在我们的构建服务器上,我们通过nant脚本明确删除bin和obj目录。
每个项目构建脚本都负责其输出/临时目录。这样做非常好。因此,当我们更改一个项目并添加一个新项目时,我们会以工作脚本为基础编写脚本,并注意到删除阶段并加以处理。
如果您在逻辑开发机器上进行操作,我建议您像其他人提到的那样通过Visual Studio进行清理。

有时候我必须确保所有的构建都是全新的。我不能相信清理解决方案可以做到这一点。删除 bin 和 obj 经常被证明更可靠。 - MichaelD
对我们来说,只有从“构建机器”生成的版本才会被测试或用于生产,因此开发人员不必担心“全部清理”类型的问题,而是由构建服务器完成。这也意味着没有一个开发人员需要进行完整的构建。 - Simeon Pilgrim
1
使用nant最简单的方法是什么?我有几十个项目的层次结构,我不想在删除脚本上出错。=) - mpontillo
我们有许多可执行文件/动态链接库“asset”构建,因此对于每个资产,我们都有一个nant脚本来构建它。对于每个资产,都有一个删除部分,在其中我们放置了每个调试/发布bin/obj目录要删除的行。 - Simeon Pilgrim

1

你实际上可以继续采用PS的建议,在项目目录中创建一个vbs文件,如下所示:

Option Explicit
Dim oShell, appCmd
Set oShell  = CreateObject("WScript.Shell")
appCmd      = "powershell -noexit Get-ChildItem .\ -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse -WhatIf }"
oShell.Run appCmd, 4, false

为了安全起见,我已经包含了-WhatIf参数,所以如果您对第一次运行时的列表满意,可以将其删除。

0

针对批处理程序的解决方案。我正在使用以下命令:

FOR /D /R %%G in (obj,bin) DO @IF EXIST %%G IF %%~aG geq d RMDIR /S /Q "%%G"


不使用 DIR /S /AD /B xxx 的原因:
1. DIR /S /AD /B obj 将返回空列表(至少在我的Windows10上是这样) enter image description here
2. DIR /S /AD /B *obj 将包含意外的结果(tobj文件夹) enter image description here


@IF EXIST %%G IF %%~aG geq d 用于检查路径是否存在,且该路径是一个文件夹而不是一个文件。 - xianyi

0
这对我来说很好用: for /d /r . %%d in (bin,obj, ClientBin,Generated_Code) do @if exist "%%d" rd /s /q "%%d"

0

“clean”不够好吗?请注意,您可以在命令行中使用/t:clean调用msbuild。


14
“干净”并不足够好,特别是在使用MEF时更是如此。 “干净解决方案”并不能清除您已删除的引用,这可能会在动态加载文件夹的DLL时造成问题。 - Alex
8
很多“在我的机器上可以运行”的错误是由于旧的或意外存留在bin/obj文件夹中的文件引起的,这些文件不会被“清理”操作删除。 - Luke

0

我们有许多包含很多工程文件的大型 .SLN 文件。我开始实行一个政策,建立一个名为“ViewLocal”的目录,用于存放所有非源代码控制的文件。在该目录中,有一个“Inter”目录和一个“Out”目录,分别用于存放中间文件和输出文件。

这显然使得只需转到您的“viewlocal”目录并执行简单的删除操作即可轻松摆脱一切。

在你花时间想方设法通过脚本来解决问题之前,你可以考虑建立类似的东西。

但是,我不会撒谎,要在一个大组织中维护这样的设置会......有趣。尤其是当您使用像 QT 这样的技术来处理文件并创建非源代码控制的源文件时。但那是另一个故事了!


0

我使用.bat文件并使用该命令来完成此操作。

for /f %%F in ('dir /b /ad /s ^| findstr /iles "Bin"') do RMDIR /s /q "%%F"
for /f %%F in ('dir /b /ad /s ^| findstr /iles "Obj"') do RMDIR /s /q "%%F"

0
我对这个问题采取了不同的方法。与其编写一个脚本在各个地方寻找所有的“obj”和“bin”文件夹,我将构建过程指向将这些文件夹分组到一个单一、方便的位置。
在解决方案文件夹中添加一个名为Directory.Build.props的文件,如下所示:
<Project>
    <PropertyGroup>
        <BaseProjectArtifactPath>$(MSBuildThisFileDirectory).artifacts\$(MSBuildProjectName)</BaseProjectArtifactPath>
        <BaseOutputPath>$(BaseProjectArtifactPath)\bin\</BaseOutputPath>
        <BaseIntermediateOutputPath>$(BaseProjectArtifactPath)\obj\</BaseIntermediateOutputPath>
    </PropertyGroup>
</Project>

现在,“bin”和“obj”文件夹将会被创建在一个名为.artifacts的独立文件夹中,而不是各个项目文件夹中。想要重新开始?只需删除.artifacts文件夹即可。

0

假设PS1文件存在于当前文件夹(您需要删除bin和obj文件夹的文件夹内)

$currentPath = $MyInvocation.MyCommand.Path
$currentFolder = Split-Path $currentPath

Get-ChildItem $currentFolder -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }

-3

我认为您可以右键单击您的解决方案/项目,然后单击“清理”按钮。

据我记得它是这样工作的。我现在没有我的VS.NET,所以无法测试它。


这是正确的,也是所有建议解决方案中最简单和最容易的(假设它适用于特定情况...)。 - Chris Halcrow
13
抱歉,但这并不正确。它不会删除/obj文件夹中导致问题的根源内容。至少在VS 2013更新3版本中是这样的情况。 - Ognyan Dimitrov
刚刚遇到了与VS2013更新4相同的问题。(注意:VS2010正常运行) - juFo
请参考这个答案(在同一个问题下)以获得更好的解释:https://dev59.com/qnRA5IYBdhLWcg3w_DHF#18317221 - Josh M.

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