Я хочу удалить все папки 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>
Ответ 8
Чтобы удалить bin и obj перед сборкой, добавьте в файл проекта:
<Target Name="BeforeBuild">
<!-- Remove obj folder -->
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
<!-- Remove bin folder -->
<RemoveDir Directories="$(BaseOutputPath)" />
</Target>
Вот статья: Как удалить папку bin и/или obj перед сборкой или развертыванием
Ответ 9
Очень похоже на сценарии Стива PowerShell. Я просто добавил TestResults и пакеты к нему, как это необходимо для большинства проектов.
Get-ChildItem .\ -include bin,obj,packages,TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
Ответ 10
Посмотрите CleanProject, он удалит папки bin, папки obj, папки TestResults и папки Resharper. Исходный код также доступен.
Ответ 11
from Использование Windows PowerShell для удаления папок obj, bin и ReSharper
очень похож на ответ Robert H с более коротким синтаксисом
- запустить powershell
- cd (изменить dir) в корень вашей папки проекта
-
вставьте и запустите script
dir.\-include bin, obj, resharper * -recurse | foreach ($) {rd $_. fullname -Recurse -Force}
Ответ 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.
- Создайте пустой файл и назовите его DeleteBinObjFolders.bat
- Скопируйте и вставьте приведенный ниже код в файл DeleteBinObjFolders.bat
- Переместите файл 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)
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 со мной, поэтому я не могу его протестировать.