我想删除所有bin和obj文件夹以强制所有项目重建所有内容

时间:2009-04-16 09:37:50

标签: visual-studio visual-studio-2008 batch-file cmd

我使用多个项目,我想以递归方式删除名为'bin'或'obj'的所有文件夹,这样我确信所有项目都会重建所有项目(有时这是迫使Visual Studio忘记的唯一方法所有关于以前的版本)。

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

26 个答案:

答案 0 :(得分:324)

这取决于您喜欢使用的shell。

如果您在Windows上使用cmd shell,则以下内容应该有效:

FOR /F "tokens=*" %%G IN ('DIR /B /AD /S bin') DO RMDIR /S /Q "%%G"
FOR /F "tokens=*" %%G IN ('DIR /B /AD /S obj') DO RMDIR /S /Q "%%G"

如果您使用的是bash或zsh类型的shell(例如Windows上的git bash或babun或大多数Linux / OS X shell),那么这是一种更好,更简洁的方式来做你想要的:

find . -iname "bin" | xargs rm -rf
find . -iname "obj" | xargs rm -rf

这可以通过OR:

减少到一行
find . -iname "bin" -o -iname "obj" | xargs rm -rf

请注意,如果您的文件名目录包含空格或引号,则find将按原样发送这些条目,xargs可以将其分成多个条目。在macOS上,解决方法是使用-print0和-0,因此上面的示例变为:

find . -iname "bin" -print0 | xargs -0 rm -rf
find . -iname "obj" -print0 | xargs -0 rm -rf

find . -iname "bin" -o -iname "obj" -print0 | xargs -0 rm -rf

如果您使用的是Powershell,那么您可以使用:

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

Robert H's answer below所示 - 如果你选择投票,可以确保你为powershell答案而不是我给予他信任:)

当然,首先运行安全的任何命令来测试它当然是明智的!

答案 1 :(得分:201)

我找到了这个帖子并得到了宾果游戏。再多搜索一下这个强大的shell脚本:

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

我想我会分享,考虑到我在这里看时没找到答案。

答案 2 :(得分:64)

这对我有用:

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

基于superuser.com上的this answer

答案 3 :(得分:31)

我总是在我的解决方案中添加一个新目标来实现这一目标。

<Target Name="clean_folders">
  <RemoveDir Directories=".\ProjectName\bin" />
  <RemoveDir Directories=".\ProjectName\obj" />
  <RemoveDir Directories="$(ProjectVarName)\bin" />
  <RemoveDir Directories="$(ProjectVarName)\obj" />
</Target>

你可以从命令行调用它

msbuild /t:clean_folders

这可以是您的批处理文件。

msbuild /t:clean_folders
PAUSE

答案 4 :(得分:22)

我写了a powershell script来做这件事。

优点是它打印出已删除文件夹的摘要,如果您指定了要忽略的子文件夹层次结构,则会忽略这些文件夹。

Output example

答案 5 :(得分:16)

对我来说没有任何作用。我需要删除bin和obj文件夹中的所有文件以进行调试和发布。我的解决方案:

1.右键单击项目,卸载,再次右键单击编辑,转到底部

2.插入

<Target Name="DeleteBinObjFolders" BeforeTargets="Clean">
  <RemoveDir Directories="..\..\Publish" />
  <RemoveDir Directories=".\bin" />
  <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>

3。保存,重新加载项目,右键单击“清理并预先”。

答案 6 :(得分:13)

在清洁目标之后,像这样的东西应该以非常优雅的方式做到:

<Target Name="RemoveObjAndBin" AfterTargets="Clean">
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
    <RemoveDir Directories="$(TargetDir)" />
</Target>

答案 7 :(得分:7)

要在构建添加到项目文件之前删除bin和obj:

<Target Name="BeforeBuild">
    <!-- Remove obj folder -->
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
    <!-- Remove bin folder -->
    <RemoveDir Directories="$(BaseOutputPath)" />
</Target>

以下是文章:How to remove bin and/or obj folder before the build or deploy

答案 8 :(得分:3)

与Steve的PowerShell脚本非常相似。我刚刚为大多数项目添加了TestResults和软件包。

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

答案 9 :(得分:3)

查看CleanProject,它会删除bin文件夹,obj文件夹,TestResults文件夹和Resharper文件夹。源代码也可用。

答案 10 :(得分:2)

'干净'还不够好吗?请注意,您可以从命令行使用/ t:clean调用msbuild。

答案 11 :(得分:2)

Here is the answer我给了一个类似的问题,简单,简单,工作得很好,除了你已经拥有的Visual Studio之外别无需任何其他东西。

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

如果您在MSBuild项目中有一些自定义项,这可能会带来麻烦,并留下您认为应删除的内容。

你可以通过在你的。* proj上添加一个简单的更改来解决这个问题:

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

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

答案 12 :(得分:2)

来自Using Windows PowerShell to remove obj, bin and ReSharper folders

与语法较短的Robert H answer非常相似

  1. 运行powershell
  2. cd (将dir更改为项目文件夹的根目录)
  3. 粘贴并在脚本下面运行

    dir。\ -include bin,obj, resharper * -recurse | foreach($ ){rd $ _。fullname -Recurse -Force}

答案 13 :(得分: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参数,因此如果您对第一次运行的列表感到满意,请将其删除。

答案 14 :(得分:1)

http://vsclean.codeplex.com/

  

找到Visual的命令行工具   Studio解决方案并运行Clean   命令他们。这可以让你清洁   所有这些的/ bin / *目录   你躺在那里的旧项目   你的硬盘

答案 15 :(得分:1)

在我们的构建服务器上,我们通过nant脚本显式删除bin和obj目录。

每个项目构建脚本都负责它的输出/临时目录。这样做很好。因此,当我们更改项目并添加新项目时,我们将脚本从工作脚本中删除,您会注意到删除阶段并处理它。

如果你在逻辑开发机上做这件事,我会像其他人提到的那样,通过Visual Studio坚持清理。

答案 16 :(得分:1)

我使用了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

答案 17 :(得分:1)

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

  1. 创建一个空文件并将其命名为 DeleteBinObjFolders.bat
  2. 将以下代码复制粘贴到 DeleteBinObjFolders.bat
  3. DeleteBinObjFolders.bat 文件与解决方案(* .sln)文件一起移动到同一文件夹中。
  4. @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
    

答案 18 :(得分:0)

一种非常快捷,轻松的方法是使用SELECT p.FirstName FROM Person p INNER JOIN [Address] a ON p.PersonId = a.PersonId HAVING COUNT(a.*) > 1 npm实用程序,然后先在全局进行安装:

rimraf

然后来自项目根目录的命令非常简单(可以将其保存到脚本文件中):

> npm i rimraf -g

要优化效果,您可以利用在文档中指定的项目事件目标(可以使用的目标是projectRoot> rimraf **/bin **/obj 并使其运行上一条命令):https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2017

我喜欢rimraf实用程序,因为它可以跨平台运行并且非常快捷。但是,如果决定使用目标事件选项,也可以在.csproj中使用BeforeRebuild命令。 @Shaman在这里的另一个答案很好地说明了RemoveDir方法:https://stackoverflow.com/a/22306653/1534753

答案 19 :(得分:0)

这对我来说很好: 从/ d / r开始。 (bin,obj,ClientBin,Generated_Code)中的%% d做@if是否存在“ %% d” rd / s / q“ %% d”

答案 20 :(得分:0)

我bat文件使用与此commad做到这一点。

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"

答案 21 :(得分: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

答案 22 :(得分: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 }

答案 23 :(得分:0)

我们有一个包含许多项目文件的大型.SLN文件。我启动了一个“ViewLocal”目录的策略,其中包含所有非源控制文件。在该目录中是“Inter”和“Out”目录。分别用于中间文件和输出文件。

这显然可以轻松访问“viewlocal”目录并进行简单删除,以摆脱一切。

在你花时间找出解决这个问题的方法之前,你可能会考虑设置类似的东西。

我不会撒谎,但在大型组织中保持这样的设置已经证明......有趣。特别是当你使用像QT这样的技术来处理文件和创建非源控制的源文件时。但那是另一个完整的故事!

答案 24 :(得分:0)

我实际上讨厌乱丢源树的obj文件。我通常设置项目,以便他们输出源树外的obj文件。对于C#项目,我通常使用

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

对于C ++项目

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

答案 25 :(得分:-1)

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

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