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

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

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

Ответ 1

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

Если вы используете оболочку 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 может разделиться на несколько записей. В 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 }

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

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

Ответ 2

Я нашел эту нить и получил бинго. Немного больше поисков включил эту оболочку питания script:

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

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

Ответ 3

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

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

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

Ответ 4

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

<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

Ответ 5

Я написал powershell script, чтобы сделать это.

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

Output example

Ответ 6

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

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

2.Insert

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

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

Ответ 7

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

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

Ответ 9

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

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

Ответ 10

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

Ответ 12

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

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

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

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

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

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

Ответ 13

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

Ответ 14

На нашем сервере сборки мы явно удаляем каталоги bin и obj через nant-скрипты.

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

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

Ответ 15

http://vsclean.codeplex.com/

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

Ответ 16

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

Ответ 17

Это мой командный файл, который я использую для рекурсивного удаления всех папок 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

Ответ 18

Я использую небольшую модификацию Robert H, которая пропускает ошибки и печатает удаленные файлы. Обычно я также _resharper папки .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

Ответ 19

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

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

Для проектов на С++

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

Ответ 20

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

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

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

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

Ответ 21

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

Ответ 22

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

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

Ответ 23

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

> npm i rimraf -g

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

projectRoot> rimraf **/bin **/obj

Чтобы оптимизировать желаемый эффект, вы можете использовать цели проекта (вы можете использовать BeforeRebuild и заставить его выполнить предыдущую команду), которые указаны в документе: https://docs.microsoft.com/en-us/visualstudio/MSBuild/как к Extend-на-зрительно-студия-сборки-процесс? зрения = VS-2017

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

Ответ 24

//It Works Fine for me :
@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

But My Requirement is :
In My Projects, I'm managing many clients so I want to delete the folders for a particular client which is given in App.Config, Could anyone help me?

Ответ 25

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

Ответ 26

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

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