Я хочу удалить все папки bin и obj, чтобы заставить все проекты перестроить все

Я работаю с несколькими проектами, и я хочу рекурсивно удалить все папки с именем " bin " или "obj". Таким образом, я уверен, что все проекты будут перестраивать everyhing (иногда это единственный способ заставить visual studio забыть все о предыдущих сборках).

есть ли быстрый способ выполнить это (например, с файлом bat) без необходимости писать программу .net?

21 ответов


Это зависит от оболочки, которую вы предпочитаете использовать.

если вы используете оболочку cmd в Windows, то должно работать следующее:

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 (например, Git bash или babun в Windows или большинстве оболочек Linux / OS X) , то это гораздо более приятный, более краткий способ сделать то, что вы хотите:

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

и это можно свести к одной строке или:

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

если вы используете Powershell, вы можете использовать это:

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

как видно ответ Роберта H ниже - просто убедитесь, что вы даете ему кредит на ответ powershell, а не мне, если вы решите проголосовать за что-нибудь:)

было бы, конечно, разумно запустить любую команду, которую вы выберете в безопасном месте, чтобы проверить ее!


Я нашел эту нить и получил Бинго. Немного больше поиска оказалось этот скрипт power shell:

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

Я думал, что поделюсь, учитывая, что я не нашел ответа, когда искал здесь.


это сработало для меня:

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

на основе ответ ВКЛ superuser.com


Я всегда добавляю новую цель в свои решения для достижения этого.

<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

Я писал сценарий powershell сделать это.

преимущество заключается в том, что он распечатывает сводку удаленных папок и игнорирует их, если вы указали иерархию подпапок, которую нужно игнорировать.

Output example


ничего не работало для меня. Мне нужно было удалить все файлы в папках bin и obj для отладки и выпуска. Мое решение:

1.Щелкните правой кнопкой мыши проект, выгрузить, щелкните правой кнопкой мыши снова изменить, перейдите к нижней

2.Вставить

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

3. Сохраните, перезагрузите проект, щелкните правой кнопкой мыши clean и presto.


что-то вроде этого должно сделать это довольно элегантно, после чистой цели:

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

чтобы удалить bin и obj перед сборкой, добавьте в файл проекта:

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

вот статья: Как удалить папку bin и / или obj перед сборкой или развертыванием


посмотреть CleanProject, он удалит папки bin, папки obj, папки TestResults и папки Resharper. Исходный код также доступен.


"чистый" недостаточно хорош? Обратите внимание, что вы можете вызвать msbuild с /t:clean из командной строки.


с использование Windows PowerShell для удаления папок obj, bin и ReSharper

очень похож на Роберт H ответ короче синтаксис

  1. запустите powershell
  2. компакт-диск(изменить dir) в корень вашей папки проекта
  3. вставить и запустить ниже скрипт

    реж .\ - включить bin, obj,resharper* - recurse | foreach($) { rd $_.полное имя –рекурсия - Force}


вот ответ: Я дал аналогичный вопрос, простой, легкий, работает довольно хорошо и не требует ничего, кроме того, что у вас уже есть с Visual Studio.

поскольку другие уже ответили, Clean удалит все артефакты, созданные сборкой. Но все остальное останется позади.

Если у вас есть некоторые настройки в вашем проекте MSBuild, это может вызвать проблемы и оставить позади вещи, которые вы думаете, что это должно быть удаленный.

вы можете обойти эту проблему с помощью простых изменений в вашем .* proj, добавив Это где-то в конце :

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

который удалит все в вашей папке bin текущей платформы / конфигурации.


очень похоже на сценарии PowerShell Стива. Я просто добавил TestResults и пакеты к нему, как это необходимо для большинства проектов.

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

на нашем сервере сборки мы явно удаляем каталоги bin и obj с помощью скриптов nant.

каждый сценарий сборки проекта отвечает за его выходные/временные каталоги. Это прекрасно работает. Поэтому, когда мы меняем проект и добавляем новый, мы основываем сценарий на рабочем сценарии, и вы замечаете стадию удаления и заботитесь о ней.

Если вы делаете это на машине разработки логики, я бы придерживался очистки через Visual Studio, как упоминали другие.


http://vsclean.codeplex.com/

инструмент командной строки, который находит Visual Studio solutions и запускает чистую командуйте ими. Это позволяет вам очистить вверх по каталогам /bin/* всех тех старые проекты, на которых ты валяешься. ваш жесткий диск


вы могли бы на самом деле принять предложение 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, поэтому удалите его, если вы удовлетворены списком при первом запуске.


Я действительно ненавижу файлы obj, усеивающие исходные деревья. Обычно я настраиваю проекты так, чтобы они выводили obj-файлы за пределы исходного дерева. Для проектов C# я обычно использую

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

для проектов C++

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

У нас большой .SLN файлы со многими файлами проекта. Я начал политику наличия каталога" ViewLocal", где находятся все файлы, не контролируемые sourcecontrolled. Внутри этого каталога есть каталог "Inter" и "Out". Для промежуточных файлов и выходных файлов, соответственно.

Это, очевидно, позволяет легко просто перейти в каталог "viewlocal" и сделать простое удаление, чтобы избавиться от всего.

прежде чем вы потратили время, выясняя способ обойдя это с помощью скриптов, Вы можете подумать о настройке чего-то подобного.

Я не буду лгать, хотя, поддержание такой установки в большой организации доказало....интересный. Особенно когда вы используете такие технологии как Qt, что бы обрабатывать файлы и создавать не sourcecontrolled исходные файлы. Но это совсем другая история!


учитывая, что файл PS1 присутствует в currentFolder (папка, в которой вам нужно удалить папки bin и obj)

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

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

Это мой пакетный файл, который я использую для рекурсивного удаления всех папок BIN и OBJ.

  1. создать пустой файл и назовите его DeleteBinObjFolders.летучая мышь!--6-->
  2. копировать-вставить код ниже кода в DeleteBinObjFolders.летучая мышь!--6-->
  3. перемещение DeleteBinObjFolders.летучая мышь!--6--> файл в той же папке с вашим решением (*.файл 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

Я думаю, вы можете щелкнуть правой кнопкой мыши на своем решении/проекте и нажать кнопку "Очистить".

насколько я помню, он работал именно так. У меня нет ... VS.NET со мной сейчас так нельзя.