I want to delete all bin and obj folders to force all projects to rebuild everything
Asked Answered
Z

30

452

I work with multiple projects, and I want to recursively delete all folders with the name 'bin' or 'obj' that way I am sure that all projects will rebuild everything (sometimes it's the only way to force Visual Studio to forget all about previous builds).

Is there a quick way to accomplish this (with a .bat file for example) without having to write a .NET program?

Zahavi answered 16/4, 2009 at 9:37 Comment(2)
It would be nice if Build->Clean Solution actually did this.Parish
There is a plugin I found called CleanBinAndObj which deletes all the bin and obj folders. Very effective for single solutions containing many projects.Angio
F
709

This depends on the shell you prefer to use.

If you are using the cmd shell on Windows then the following should work:

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"

If you are using a bash or zsh type shell (such as git bash or babun on Windows or most Linux / OS X shells) then this is a much nicer, more succinct way to do what you want:

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

and this can be reduced to one line with an OR:

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

Note that if your directories of filenames contain spaces or quotes, find will send those entries as-is, which xargs may split into multiple entries. If your shell supports them, -print0 and -0 will work around this short-coming, so the above examples become:

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

and:

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

If you are using Powershell then you can use this:

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

as seen in Robert H's answer below - just make sure you give him credit for the powershell answer rather than me if you choose to up-vote anything :)

It would of course be wise to run whatever command you choose somewhere safe first to test it!

Fluid answered 16/4, 2009 at 9:54 Comment(17)
thx for your answer. I get an error: %%G was unexpected at this time.Zahavi
Hmm that's odd - it works fine on my machine (vista 64bit business) - I'll try it on an xp machine too.Fluid
allright i got it to work. one strange issue is that when there is a bin folder in the root he doesn't delete anything. but that doesn't matterZahavi
have you got any idea how i let the script search in a folder other than it's running from?Zahavi
got it, by doing: r: FOR /F "tokens=*" %%G IN ('DIR /B /AD /S obj') DO RMDIR /S /Q "%%G" FOR /F "tokens=*" %%G IN ('DIR /B /AD /S bin') DO RMDIR /S /Q "%%G" PauseZahavi
Note that iterating over dir output in this way can lead to unexpected failures with Unicode file or directory names and the console being set to Raster fonts. Characters that won't fit into the OEM codepage will be converted to their nearest equivalent or ?. The most likely result is that whatever you're doing with the output it just cannot find the files. Note that this doesn't happen if you use for to iterate.Detect
"%%G was unexpected at this time" - this happens when you run it from the command line instead from inside a batch file. Use single '%'s in this case.Izawa
+1 Would you mind to explain the code for me? Please.Yeast
@SteveWillcock It's better than clean. Clean won't remove dlls that are not referenced in the project anymore (leftovers).Tutankhamen
Doesn't work in Windows 8. The powershell script below works.Tait
We can use 'name' instead of 'iname' if you want to do the search case-sensitive. find . -name "bin" | xargs rm -rfDire
Make sure you don't have any programs open that have locked the files. Otherwise you might get strange access denied errors.Lobectomy
I would suggest excluding node_modules if you have it. A lot of packages have their own bin folder (like Gulp) and it can cause things to break if you delete them. You'll likely have to run npm install to repopulate the bin folder.Custer
I had the some need as JED, I excluded the node_modules with this command. Get-ChildItem -Recurse -include bin,obj | Where-Object {$_.FullName -notMatch "node_modules"} After this you can pipe into the foreach as mentioned in the answer.Aftertime
I don't recommend those commands. I've tried it and it messed up my entire repository. Looks like it entered inside the .git folders and messed everything upBaldhead
Doesn't work without second comment.Erlond
On Windows 11 only the powershell solution works.Clunk
E
501

I found this thread and got bingo. A little more searching turned up this power shell script:

Get-ChildItem .\ -include bin,obj -Recurse | ForEach-Object ($_) { Remove-Item $_.FullName -Force -Recurse }

Or more terse:

gci -include bin,obj -recurse | remove-item -force -recurse

I thought I'd share, considering that I did not find the answer when I was looking here.

Ectoderm answered 8/5, 2011 at 0:1 Comment(4)
@Nigel, Isn't this solution extremely un-performant? Why not write a custom C script that can run at 10x the speed?Tumultuous
I needed to also exclude folders from the searchpath, and I like the -WhatIf flag to test first, so I ended up with this: $foldersToRemove='bin','obj';[string[]]$foldersToIgnore='ThirdParty';Get-ChildItem .\ -Include $foldersToRemove -Recurse|Where-Object{$_.FullName -inotmatch "\\$($foldersToIgnore -join '|')\\"}|Remove-Item -Force -Recurse -WhatIf (a bit messy here as one line though :) )Wing
@ChrisJ Consider adding a new answer with your solution.Fen
@JohnySkovdal same thing but smaller: gci -exclude "*.dll" -include bin,obj -recurse | remove-item -force -recurseFoliate
R
90

This worked for me:

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

Based on this answer on superuser.com

Radiance answered 23/8, 2011 at 19:0 Comment(2)
Great, and easy to extend. I use for /d /r . %%d in (bin,obj,App_Data,packages) do @if exist "%%d" rd /s/q "%%d"Bouncing
@ParoX you need to run it inside a .bat fileBaroja
O
43

I wrote a powershell script to do it.

The advantage is that it prints out a summary of deleted folders, and ignored ones if you specified any subfolder hierarchy to be ignored.

Output example

Observation answered 24/1, 2012 at 13:55 Comment(6)
+1 very nice! Just found out that we can actually debug and see the variables like a full-fetch debugger in Window Power Shell!Thumb
I like this solution. I don't have to mess with Visual Studio and I can run this when I want. Very nice!Toluol
Suits my needs perfectly, but I'm not sure why this couldn't be a gist rather than a full-blown repo. :-)Teleprinter
Nice work! I would omit all directories scanning because when you have thousands of subdirectories, this could be quite slow. Too high price just for statistics :-). Also I would add $_ -notmatch 'node_modules' condition to $FoldersToRemove variable definitionEleaseeleatic
On top of what Tomino suggested, I suggest excluding the packages folder. Here's the updated list $FoldersToRemove = Get-ChildItem .\ -include bin,obj -Recurse | where {$_ -notmatch 'tools' -and $_ -notmatch '_build' -and $_ -notmatch 'node_modules' -and $_ -notmatch 'packages'} | foreach {$.fullname}Zoophilia
Still a nice solution in 2022!Allcot
W
36

I use to always add a new target on my solutions for achieving this.

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

And you can call it from command line

msbuild /t:clean_folders

This can be your batch file.

msbuild /t:clean_folders
PAUSE
Winnifredwinning answered 23/6, 2009 at 15:43 Comment(3)
This does not work for a sln file since you cannot call custom targets on them or do you know a workaround for thisPrepotency
@PiotrOwsiak yes, you need to create file "before.MySlnFileName.sln.targets" in the same directory where you have your .sln and put there your target definitionsApocope
you can add AfterTargets="Clean" as an attribute to the Target, it will be automatically called after the Clean which is invoked directly or indirectly when doing a rebuildCliff
L
16

Nothing worked for me. I needed to delete all files in bin and obj folders for debug and release. My solution:

1.Right click project, unload, right click again edit, go to bottom

2.Insert

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

3. Save, reload project, right click clean and presto.

Laudation answered 4/11, 2014 at 17:46 Comment(0)
L
13

NB: This is an old answer and may need a tweak for newer versions as of VS 2019 and some obj artifacts. Before using this approach, please make sure VS doesn't need anything in your target and output directory to build successfully.

Something like that should do it in a pretty elegant way, after clean target:

<Target Name="RemoveObjAndBin" AfterTargets="Clean">
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
    <RemoveDir Directories="$(TargetDir)" />
</Target>
Lodhia answered 14/3, 2014 at 9:32 Comment(2)
In VS2019 i found out that this makes the IDE hang for quite some time and has issues with Rebuild and project.assets.jsonStocks
Thanks Mattias, I have added a warning. I guess it depends on the project type and maybe not a good idea to fully clean some of the projects. There should be a tweak for that.Lodhia
W
13

A very quick and painless way is to use the rimraf npm utility, install it globally first:

> npm i rimraf -g

And then the command from your project root is quite simple (which can be saved to a script file):

projectRoot> rimraf **/bin **/obj

To optimize the desired effect you can leverage the project event targets (the one you could use is BeforeRebuild and make it run the previous command) which are specified in the docs: https://learn.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2017

I like the rimraf utility as it is crossplat and really quick. But, you can also use the RemoveDir command in the .csproj if you decide to go with the target event option. The RemoveDir approach was well explained in another answer here by @Shaman: https://mcmap.net/q/75178/-i-want-to-delete-all-bin-and-obj-folders-to-force-all-projects-to-rebuild-everything

Worcestershire answered 28/2, 2019 at 21:46 Comment(3)
Work on Mac too!Mineral
Yes (almost?) NodeJS/npm works everywhere... hah.Pardew
IMHO, If your are working on a Unix like OS, such as Linux, macOS, you actually don't need rimraf. rm -rf **/bin **/obj will do the same thing. However, one thing is worth reminding, if you have Projects that live on a deeper level subdirectory, both solutions will not delete the bin/obj dirs of those projects. So this solution works for most scenarios, but not all scenarios.Viehmann
B
7

To delete bin and obj before build add to project file:

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

Here is article: How to remove bin and/or obj folder before the build or deploy

Bever answered 10/3, 2014 at 17:7 Comment(1)
You'll only want to do this on a rebuild, though. Unless you want every build to be a rebuild!Ardolino
V
7

Very similar to Steve's PowerShell scripts. I just added TestResults and packages to it as it is needed for most of the projects.

Get-ChildItem .\ -include bin,obj,packages,TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
Volition answered 13/3, 2017 at 11:33 Comment(0)
S
6

This is my batch file that I use for deleting all BIN and OBJ folders recursively.

  1. Create an empty file and name it DeleteBinObjFolders.bat
  2. Copy-paste code the below code into the DeleteBinObjFolders.bat
  3. Move the DeleteBinObjFolders.bat file in the same folder with your solution (*.sln) file.
@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
Shoa answered 19/3, 2018 at 6:51 Comment(2)
I just put this script on my desktop - but added the line cd C:\Git\Workspace after the first line...Dmz
Please note, that /r takes precedence over /d, therefore files named "bin" and "obj" might also be deleted. The FOR command has discrete "modes". R and D are examples of those modes, of which only one is active any give time.Courtnay
D
6

I use a slight modification of Robert H which skips errors and prints the delete files. I usally also clear the .vs, _resharper and package folders:

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

Also worth to note is the git command which clears all changes inclusive ignored files and directories:

git clean -dfx
Downandout answered 4/2, 2019 at 14:29 Comment(2)
git clean -dfx is perfectAffettuoso
Mind you git clean will remove everything that is not part of root repo. May not be what you want if you need to remove only bin and obj.Emptyheaded
P
4

In VS 2019/VS 2022 this is the only sane solution.

In the solution folder (where the .sln file is located), create a file called Directory.Build.props and add edit it as shown below. Read about this special file here.

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>

No need to modify a bunch of .csproj files. Also, note that I'm not removing $(TargetDir) as some have suggested. Doing so might cripple the build system if $(OutDir) has been set to some custom directory (a common thing to do).

Peluso answered 21/10, 2021 at 9:0 Comment(1)
It should be noted that this solution sometimes interferes with VS, causing it to complain about a missing project.assets.json. Have since deactivated it in my solution. Some improvements are necessary.Peluso
E
4

Several solutions above give answers how to exclude folders, but not in cmd. Expanding on Steve Willcock's answer, to exclude e.g. the node_modules folder, that may have bin folders in it, one can use the expanded one-liner below.

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

As noted by others, in the case of putting the above command in a cmd script and not using it directly in the command line, substitute %G with %%G.

Ejectment answered 3/11, 2021 at 11:29 Comment(1)
replace %G with %%GTranspacific
A
3

Have a look at the CleanProject, it will delete bin folders, obj folders, TestResults folders and Resharper folders. The source code is also available.

Alphabetize answered 6/2, 2013 at 12:37 Comment(1)
The project appears to have moved to here: code.msdn.microsoft.com/windowsdesktop/…Wing
T
3

from Using Windows PowerShell to remove obj, bin and ReSharper folders

very similar to Robert H answer with shorter syntax

  1. run powershell
  2. cd(change dir) to root of your project folder
  3. paste and run below script

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

Trengganu answered 4/6, 2013 at 19:12 Comment(0)
C
3

Here is the answer I gave to a similar question, Simple, easy, works pretty good and does not require anything else than what you already have with Visual Studio.

As others have responded already Clean will remove all artifacts that are generated by the build. But it will leave behind everything else.

If you have some customizations in your MSBuild project this could spell trouble and leave behind stuff you would think it should have deleted.

You can circumvent this problem with a simple change to your .*proj by adding this somewhere near the end :

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

Which will remove everything in your bin folder of the current platform/configuration.

Cliff answered 19/8, 2013 at 15:10 Comment(0)
C
3

In Visual Studio, I've a nice custom command that I can run over a solution:

  1. Create an external tool from Tools->External Tools like this:

Visual Studio external tools dialog

Command: cmd.exe

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

Initial directory: $(SolutionDir)

  1. Add the command to the Solution context menu.

Right-click on the toolbar and select Customize button:

Visual Studio Commands Customize Menu

Add a new command and select the correct External Command (in my case was External Command 6 as it was the sixth command):

Visual Studio Commands Dialog

  1. Enjoy!
Chiao answered 19/4, 2023 at 8:18 Comment(0)
W
2

I actually hate obj files littering the source trees. I usually setup projects so that they output obj files outside source tree. For C# projects I usually use

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

For C++ projects

 IntermediateDirectory="..\..\obj\$(ProjectName)\$(ConfigurationName)"
Wace answered 16/4, 2009 at 12:56 Comment(0)
C
1

On our build server, we explicitly delete the bin and obj directories, via nant scripts.

Each project build script is responsible for it's output/temp directories. Works nicely that way. So when we change a project and add a new one, we base the script off a working script, and you notice the delete stage and take care of it.

If you doing it on you logic development machine, I'd stick to clean via Visual Studio as others have mentioned.

Cloraclorinda answered 16/4, 2009 at 10:16 Comment(4)
sometimes i just have to be sure that all builds are completely new. I can't trust clean solution for doing that.deleting bin and obj has often proven more reliableZahavi
For us, only builds from the 'build machine' are tested, or used in production, so the developers don't have must be 'all clean' type issues, and the build server does that. Also means no one developer is needed to make a full build.Cloraclorinda
What is the easiest way to do this with nant? I have A hierarchy of a couple dozen projects and I'd rather not misfire on a delete script. =)Prud
We have many executables/dlls 'asset' built, so per asset we have a nant script that builds it. For each one there is a Delete section where we place a line for each debug/release bin/obj directory we want deleted.Cloraclorinda
E
1

http://vsclean.codeplex.com/

Command line tool that finds Visual Studio solutions and runs the Clean command on them. This lets you clean up the /bin/* directories of all those old projects you have lying around on your harddrive

Extravehicular answered 23/6, 2009 at 15:39 Comment(0)
V
1

You could actually take the PS suggestion a little further and create a vbs file in the project directory like this:

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

For safety, I have included -WhatIf parameter, so remove it if you are satisfied with the list on the first run.

Verena answered 30/3, 2012 at 19:52 Comment(0)
B
0

Is 'clean' not good enough? Note that you can call msbuild with /t:clean from the command-line.

Barrettbarrette answered 16/4, 2009 at 9:39 Comment(2)
Indeed "clean" is not good enough. This is especially true when using MEF. "Clean Solution" does not get rid of references you've removed which can cause issues when dynamically loading a folder's DLLs.Maladapted
A lot of "works on my machine" bugs are caused by old or unexpected stuff sitting around in the bin/obj folders that is not removed by doing a "clean".Masteratarms
J
0

We have a large .SLN files with many project files. I started the policy of having a "ViewLocal" directory where all non-sourcecontrolled files are located. Inside that directory is an 'Inter' and an 'Out' directory. For the intermediate files, and the output files, respectively.

This obviously makes it easy to just go to your 'viewlocal' directory and do a simple delete, to get rid of everything.

Before you spent time figuring out a way to work around this with scripts, you might think about setting up something similar.

I won't lie though, maintaining such a setup in a large organization has proved....interesting. Especially when you use technologies such as QT that like to process files and create non-sourcecontrolled source files. But that is a whole OTHER story!

Jake answered 16/4, 2009 at 13:20 Comment(0)
K
0

Considering the PS1 file is present in the currentFolder (the folder within which you need to delete bin and obj folders)

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

Get-ChildItem $currentFolder -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
Keloid answered 16/5, 2016 at 13:4 Comment(0)
S
0

For the solution in batch. I am using the following command:

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


The reason not using DIR /S /AD /B xxx
1. DIR /S /AD /B obj will return empty list (at least on my Windows10) enter image description here
2. DIR /S /AD /B *obj will contain the result which is not expected (tobj folder) enter image description here

Stickleback answered 7/1, 2019 at 6:8 Comment(1)
@IF EXIST %%G IF %%~aG geq d is used for checking path existing and the path is a folder not a file.Stickleback
L
0

This Works Fine For Me: start for /d /r . %%d in (bin,obj, ClientBin,Generated_Code) do @if exist "%%d" rd /s /q "%%d"

Lantha answered 4/6, 2019 at 6:25 Comment(0)
A
0

I use .bat file with this commad to do that.

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"
Airing answered 12/12, 2019 at 10:9 Comment(0)
S
0

I took a different approach to this problem. Rather than write a script to hunt for all the "obj" and "bin" folders in various places, I direct the build process to group those folders in a single, convenient location.

Add a Directory.Build.props file to the solution folder like so:

<Project>
    <PropertyGroup>
        <BaseProjectArtifactPath>$(MSBuildThisFileDirectory).artifacts\$(MSBuildProjectName)</BaseProjectArtifactPath>
        <BaseOutputPath>$(BaseProjectArtifactPath)\bin\</BaseOutputPath>
        <BaseIntermediateOutputPath>$(BaseProjectArtifactPath)\obj\</BaseIntermediateOutputPath>
    </PropertyGroup>
</Project>

Now, all of the "bin" & "obj" folders will be created in a separate .artifacts folder in the solution root, rather than the various project folders. Ready to start with a clean slate? Just delete the .artifacts folder and you're good to go.

Steeple answered 17/1, 2023 at 15:48 Comment(0)
M
-3

I think you can right click to your solution/project and click "Clean" button.

As far as I remember it was working like that. I don't have my VS.NET with me now so can't test it.

Merideth answered 16/4, 2009 at 9:40 Comment(4)
That's correct, and by far the most simple and easiest of all the suggested solutions (assuming it's appropriate to the specific situation....)Stasiastasis
Sorry, but this is simply not true. It does not delete the contents of /obj which are the root of the problem. At least this is the situation with VS 2013 update 3.Brandonbrandt
Just had the same problem with VS2013 update 4. (Note: VS2010 was doing fine)Tad
See this answer (on this very same question) for a better explanation: https://mcmap.net/q/75178/-i-want-to-delete-all-bin-and-obj-folders-to-force-all-projects-to-rebuild-everythingArdolino

© 2022 - 2024 — McMap. All rights reserved.