it-swarm.com.ru

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

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

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

200
MichaelD

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

Если вы используете командную оболочку 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, а не мне, если вы решите что-либо проголосовать :)

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

313
Steve Willcock

Я нашел эту тему и получил бинго. Немного больше поиска обнаружил этот мощный сценарий Shell:

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

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

194
Robert H.

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

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

Основываясь на этот ответ на superuser.com

63
Daniel Rehner

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

<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
31
Jhonny D. Cano -Leftware-

Я написал скрипт PowerShell , чтобы сделать это. 

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

Output example

22
doblak

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

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

2.Insert

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

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

16
Kdefthog

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

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

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

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

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

7
Shaman

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

3
habakuk

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

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

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

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

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

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

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

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

2
Newtopian

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

2
Brian

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

очень похоже на Robert H answer с более коротким синтаксисом 

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

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

2
Iman Abidi

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

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

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

1
Simeon Pilgrim

Я использую небольшую модификацию 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
1
eugstman

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

1
KL XL

http://vsclean.codeplex.com/

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

1
Joel Martinez

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

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

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

0
xianyi

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

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

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

 IntermediateDirectory="..\..\obj\$(ProjectName)\$(ConfigurationName)"
0
Juozas Kontvainis

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

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

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

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

0
pj4533

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

0
Mudit Sharma

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

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

> npm i rimraf -g

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

projectRoot> rimraf **/bin **/obj

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

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

0
Vedran Mandić