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

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

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


person MichaelD    schedule 16.04.2009    source источник
comment
Было бы неплохо, если бы Build- ›Clean Solution действительно это делал.   -  person Dustin Andrews    schedule 18.09.2017


Ответы (26)


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

Если вы используете оболочку 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

Обратите внимание, что если ваши каталоги имен файлов содержат пробелы или кавычки, find отправит эти записи как есть, а xargs может разбить их на несколько записей. Если ваша оболочка поддерживает их, -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 }

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

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

person Steve Willcock    schedule 16.04.2009
comment
спасибо за ваш ответ. Я получаю сообщение об ошибке: %% G было неожиданным. - person MichaelD; 16.04.2009
comment
Хм, это странно - он отлично работает на моей машине (vista 64bit business) - я тоже попробую на машине xp. - person Steve Willcock; 16.04.2009
comment
хорошо, у меня это работает. одна странная проблема заключается в том, что когда в корне есть папка bin, он ничего не удаляет. но это не имеет значения - person MichaelD; 16.04.2009
comment
Вы хоть представляете, как разрешить скрипту искать в папке, отличной от того, из которой он запущен? - person MichaelD; 16.04.2009
comment
получил это, выполнив: 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 Пауза - person MichaelD; 16.04.2009
comment
Обратите внимание, что повторение dir вывода таким образом может привести к неожиданным сбоям с именами файлов или каталогов Unicode и с настройкой консоли на растровые шрифты. Символы, которые не помещаются в кодовую страницу OEM, будут преобразованы в их ближайший эквивалент или ?. Наиболее вероятный результат состоит в том, что что бы вы ни делали с выводом, он просто не может найти файлы. Обратите внимание, что этого не произойдет, если вы используете for для итерации. - person Joey; 12.05.2011
comment
%% G был неожиданным в это время - это происходит, когда вы запускаете его из командной строки, а не из командного файла. В этом случае используйте одиночные символы "%". - person Designpattern; 11.01.2012
comment
+1 Не могли бы вы объяснить мне код? Пожалуйста. - person fiberOptics; 06.02.2014
comment
@SteveWillcock Это лучше, чем чистить. Clean больше не удаляет библиотеки DLL, на которые нет ссылок в проекте (остатки). - person Piotr Szmyd; 20.11.2014
comment
Не работает в Windows 8. Приведенный ниже сценарий PowerShell работает. - person cbp; 11.12.2014
comment
Мы можем использовать «name» вместо «iname», если вы хотите выполнять поиск с учетом регистра. найти . -имя bin | xargs rm -rf - person Ramaraj T; 27.06.2018
comment
Убедитесь, что у вас не открыты программы, которые заблокировали файлы. В противном случае вы можете получить странные ошибки отказа в доступе. - person Jim Aho; 04.12.2018
comment
Я бы предложил исключить node_modules, если он у вас есть. У многих пакетов есть собственная папка bin (например, Gulp), и это может привести к поломке, если вы их удалите. Скорее всего, вам придется запустить npm install, чтобы заново заполнить папку bin. - person JED; 15.04.2020
comment
У меня была некоторая потребность как JED, я исключил node_modules с помощью этой команды. Get-ChildItem -Recurse -include bin,obj | Where-Object {$_.FullName -notMatch "node_modules"} После этого вы можете подключиться к foreach, как указано в ответе. - person JabberwockyDecompiler; 24.07.2020
comment
Я не рекомендую эти команды. Я пробовал, и он испортил весь мой репозиторий. Похоже, он вошел в папки .git и все испортил - person ; 26.11.2020

Я нашел эту тему и получил бинго. Еще немного поисков нашло этот сценарий оболочки питания:

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

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

person Robert H.    schedule 08.05.2011
comment
@Nigel, разве это решение не крайне неэффективно? Почему бы не написать собственный сценарий C, который может работать в 10 раз быстрее? - person Pacerier; 03.01.2015
comment
Вам не нужен foreach - вы должны просто передать gci прямо в remove-item (т.е. gci -include bin,obj -recurse | remove-item -force -recurse) - person Chris J; 16.03.2015
comment
Мне также нужно было исключить папки из пути поиска, и мне нравится проверять флаг -WhatIf в первую очередь, поэтому я получил следующее: $foldersToRemove='bin','obj';[string[]]$foldersToIgnore='ThirdParty';Get-ChildItem .\ -Include $foldersToRemove -Recurse|Where-Object{$_.FullName -inotmatch "\\$($foldersToIgnore -join '|')\\"}|Remove-Item -Force -Recurse -WhatIf (хотя здесь немного беспорядочно, как одна строка :)) - person Johny Skovdal; 16.04.2018
comment
@ChrisJ Рассмотрите возможность добавления нового ответа в свое решение. - person granadaCoder; 19.05.2020
comment
Это не работает должным образом, я получаю много сообщений об ошибках, например: remove-item : Impossible de supprimer l'élément C:\Projects\...: Impossible de trouver une partie du chemin d'accès 'AccessibilityManagerCompat_AccessibilityStateChangeListenerImplementor.class'. + CategoryInfo : WriteError: (AccessibilityMa...plementor.class:FileInfo) [Remove-Item], DirectoryNotFoundException + FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand - person Gold.strike; 21.01.2021

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

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

На основе этот ответ на superuser.com

person Daniel Rehner    schedule 23.08.2011
comment
Отлично и легко расширяется. Использую для / d / r. %% d в (bin, obj, App_Data, packages) @if exists %% d rd / s / q %% d - person RickAndMSFT; 25.07.2013
comment
@ParoX вам нужно запустить его внутри файла .bat - person James L; 10.08.2016

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

<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
person Jhonny D. Cano -Leftware-    schedule 23.06.2009
comment
Это не работает для файла sln, поскольку вы не можете вызывать для них настраиваемые цели или знаете ли вы обходной путь для этого - person Piotr Owsiak; 03.11.2010
comment
@PiotrOwsiak да, вам нужно создать файл до MySlnFileName.sln.targets в том же каталоге, где у вас есть ваш .sln, и поместить туда свои целевые определения - person Endrju; 06.10.2014
comment
вы можете добавить AfterTargets = Clean в качестве атрибута к Target, он будет автоматически вызываться после Clean, который вызывается прямо или косвенно при выполнении перестройки - person Newtopian; 24.11.2015

Для этого я написал сценарий PowerShell.

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

Пример вывода

person doblak    schedule 24.01.2012
comment
+1 очень красиво! Только что выяснилось, что мы действительно можем отлаживать и видеть переменные, как отладчик полной выборки в Window Power Shell! - person wiz_lee; 24.04.2015
comment
Мне нравится это решение. Мне не нужно возиться с Visual Studio, и я могу запустить это, когда захочу. Очень хорошо! - person Halcyon; 07.08.2015
comment
Идеально соответствует моим потребностям, но я не уверен, почему это не могло быть сутью, а не полноценным репо. :-) - person Dan Atkinson; 29.12.2016
comment
Хорошая работа! Я бы пропустил сканирование всех каталогов, потому что, когда у вас тысячи подкаталогов, это может быть довольно медленным. Слишком высокая цена для статистики :-). Также я бы добавил условие $_ -notmatch 'node_modules' в определение переменной $FoldersToRemove - person Tomino; 24.05.2017

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

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

2. вставка

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

3. Сохраните, перезагрузите проект, щелкните правой кнопкой мыши "Очистить" и "Готово".

person Kdefthog    schedule 04.11.2014

NB: это старый ответ, и ему может потребоваться настройка для более новых версий VS 2019 и некоторых артефактов obj. Перед использованием этого подхода убедитесь, что VS ничего не нужно в вашем целевом и выходном каталоге для успешной сборки.

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

<Target Name="RemoveObjAndBin" AfterTargets="Clean">
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
    <RemoveDir Directories="$(TargetDir)" />
</Target>
person vezenkov    schedule 14.03.2014
comment
В VS2019 я обнаружил, что это заставляет IDE зависать на некоторое время и возникают проблемы с Rebuild и project.assets.json. - person Mattias Cibien; 12.03.2021
comment
Спасибо, Маттиас, я добавил предупреждение. Я предполагаю, что это зависит от типа проекта, и, возможно, не стоит полностью очищать некоторые из проектов. Для этого должна быть настройка. - person vezenkov; 26.03.2021

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

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

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

person Igor    schedule 10.03.2014
comment
Однако вы захотите сделать это только при перестройке. Если только вы не хотите, чтобы каждая сборка была переделкой! - person Josh M.; 22.10.2015

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

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

Очень быстрый и безболезненный способ - использовать утилиту rimraf npm, сначала установите ее глобально:

> npm i rimraf -g

И тогда команда из корня вашего проекта довольно проста (ее можно сохранить в файл сценария):

projectRoot> rimraf **/bin **/obj

Чтобы оптимизировать желаемый эффект, вы можете использовать целевые объекты событий проекта (вы можете использовать BeforeRebuild и запустить предыдущую команду), которые указаны в документах: https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2017

Мне нравится утилита rimraf, поскольку она кроссплатформенная и очень быстрая. Но вы также можете использовать команду RemoveDir в .csproj, если вы решите использовать опцию целевого события. Подход RemoveDir был хорошо объяснен в другом ответе здесь @Shaman: https://stackoverflow.com/a/22306653/1534753

person Vedran Mandić    schedule 28.02.2019

Это мой командный файл, который я использую для рекурсивного удаления всех папок 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
person Alper Ebicoglu    schedule 19.03.2018
comment
Я просто поместил этот скрипт на свой рабочий стол - но добавил строку cd C:\Git\Workspace после первой строки ... - person James S; 14.04.2021

Взгляните на CleanProject, он удалит папки bin, папки obj , Папки TestResults и папки Resharper. Исходный код также доступен.

person habakuk    schedule 06.02.2013
comment
Похоже, что проект переместился сюда: code.msdn.microsoft .com / windowsdesktop / - person Johny Skovdal; 16.04.2018

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

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

  1. запустить PowerShell
  2. cd (изменить каталог) в корень папки вашего проекта
  3. вставьте и запустите ниже скрипт

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

person Iman    schedule 04.06.2013

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

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

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

Вы можете обойти эту проблему, просто изменив свой. * Proj, добавив это где-нибудь в конце:

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

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

person Newtopian    schedule 19.08.2013

Разве «чистый» недостаточно? Обратите внимание, что вы можете вызвать msbuild с помощью / t: clean из командной строки.

person Brian    schedule 16.04.2009
comment
Действительно чистота не достаточно хороша. Это особенно актуально при использовании MEF. Clean Solution не избавляет от удаленных ссылок, которые могут вызвать проблемы при динамической загрузке библиотек DLL папки. - person Alex; 18.04.2012
comment
Многие работы над ошибками моей машины вызваны старыми или неожиданными вещами, лежащими в папках bin / obj, которые не удаляются при очистке. - person Luke; 16.04.2014

Я использую небольшую модификацию Robert H, которая пропускает ошибки и выводит файлы удаления. Обычно я также очищаю папки .vs, _resharper и package:

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

Также стоит отметить команду git, которая очищает все изменения, включая игнорируемые файлы и каталоги:

git clean -dfx
person eugstman    schedule 04.02.2019

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

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

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

person Simeon Pilgrim    schedule 16.04.2009
comment
иногда мне просто нужно быть уверенным, что все сборки совершенно новые. Я не могу доверять чистому решению для этого. Удаление bin и obj часто оказывалось более надежным - person MichaelD; 16.04.2009
comment
Для нас только сборки из «машины сборки» тестируются или используются в производстве, поэтому у разработчиков не должно быть проблем с типом «все чистые», и сервер сборки делает это. Также означает, что для создания полной сборки не требуется ни одного разработчика. - person Simeon Pilgrim; 17.04.2009
comment
Как проще всего это сделать с помощью nant? У меня есть иерархия из пары десятков проектов, и я бы предпочел не пропускать осечку в сценарии удаления. знак равно - person mpontillo; 08.10.2010
comment
У нас есть много встроенных исполняемых файлов / DLL, поэтому для каждого актива у нас есть сценарий nant, который его строит. Для каждого из них есть раздел «Удалить», в котором мы помещаем строку для каждого каталога отладки / выпуска bin / obj, который мы хотим удалить. - person Simeon Pilgrim; 10.10.2010

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

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

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

 IntermediateDirectory="..\..\obj\$(ProjectName)\$(ConfigurationName)"
person Juozas Kontvainis    schedule 16.04.2009

http://vsclean.codeplex.com/

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

person Joel Martinez    schedule 23.06.2009

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

person KL XL    schedule 30.03.2012

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

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

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

Я не буду лгать, поддержание такой установки в большой организации оказалось .... интересным. Особенно, когда вы используете такие технологии, как QT, которые любят обрабатывать файлы и создавать исходные файлы, не контролируемые исходным кодом. Но это совсем ДРУГАЯ история!

person pj4533    schedule 16.04.2009

Учитывая, что файл 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 }
person ShivanandSK    schedule 16.05.2016

Для решения в пакетном режиме. Я использую следующую команду:

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) введите описание изображения здесь
2. DIR /S /AD /B *obj будет содержать неожиданный результат (tobj папка)  введите здесь описание изображения

person xianyi    schedule 07.01.2019
comment
@IF EXIST %%G IF %%~aG geq d используется для проверки существующего пути и путь к папке, а не к файлу. - person xianyi; 07.01.2019

Это отлично подходит для меня: начните с / d / r. %% d in (bin, obj, ClientBin, Generated_Code) @if существует "%% d" rd / s / q "%% d"

person Mudit Sharma    schedule 04.06.2019

Для этого я использую файл .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"
person Hacko    schedule 12.12.2019

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

Насколько я помню, так работало. Сейчас у меня нет VS.NET, поэтому я не могу его протестировать.

person dr. evil    schedule 16.04.2009
comment
Это правильный, и, безусловно, самый простой и легкий из всех предложенных решений (при условии, что он подходит для конкретной ситуации ....) - person Chris Halcrow; 08.08.2013
comment
Извините, но это неправда. Он не удаляет содержимое / obj, которое является корнем проблемы. По крайней мере, так обстоит дело с обновлением VS 2013 3. - person Ognyan Dimitrov; 27.10.2014
comment
У меня была такая же проблема с обновлением VS2013 4. (Примечание: VS2010 был в порядке) - person juFo; 31.03.2015
comment
См. Этот ответ (на этот же вопрос) для лучшего объяснения: stackoverflow.com/a/18317221/374198 - person Josh M.; 22.10.2015