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

<p>я работаю с несколькими проектами и хочу рекурсивно удалить все папки с именем «bin» или «obj» таким образом, я уверен, что все проекты будут перестраивать все (иногда это единственный способ заставить visual studio забыть все о предыдущих строит). </p><p>есть ли быстрый способ сделать это (например, с помощью файла .bat) без необходимости писать программу .net?</p>

<p>это зависит от того, какую оболочку вы предпочитаете использовать.</p><p>если вы используете командную оболочку cmd в windows, должно работать следующее:</p><pre><code>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" </code></pre><p>если вы используете оболочку типа bash или zsh (например, git bash или babun в windows или в большинстве оболочек linux/os x), то это гораздо более удобный и лаконичный способ сделать то, что вы хотите:</p><pre><code>find . -iname "bin" | xargs rm -rf find . -iname "obj" | xargs rm -rf </code></pre><p>и это может быть уменьшено до одной строки с помощью или:</p><pre><code>find . -iname "bin" -o -iname "obj" | xargs rm -rf </code></pre><p>обратите внимание, что если ваши каталоги имен файлов содержат пробелы или кавычки, find отправит эти записи как есть, и xargs может разделиться на несколько записей. в macos обходной путь должен использовать -print0 и -0, поэтому приведенные выше примеры:</p><pre><code>find . -iname "bin" -print0 | xargs -0 rm -rf find . -iname "obj" -print0 | xargs -0 rm -rf </code></pre><p>а также:</p><pre><code>find . -iname "bin" -o -iname "obj" -print0 | xargs -0 rm -rf </code></pre><p>если вы используете powershell, вы можете использовать это:</p><pre><code>get-childitem .\ -include bin,obj -recurse | foreach ($_) { remove-item $\_.fullname -force -recurse } </code></pre><p>как видно в <a href="https://stackoverflow.com/a/5924807/542251">ответ роберта х ниже</a> - просто убедитесь, что вы отдаете ему должное за ответ в powershell, а не мне, если вы решите что-либо проголосовать :)</p><p>конечно, было бы разумно сначала выполнить любую команду, которую вы выберете в безопасном месте, чтобы проверить ее!</p>

<p>я нашел эту тему и получил бинго. немного больше поиска обнаружил этот мощный сценарий shell:</p><pre><code>get-childitem .\ -include bin,obj -recurse | foreach ($_) { remove-item $\_.fullname -force -recurse } </code></pre><p>я думал, что поделюсь, учитывая, что я не нашел ответа, когда я искал здесь.</p>

<p>это сработало для меня:</p><pre><code>for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s/q "%%d" </code></pre><p>основываясь на <a href="https://superuser.com/questions/201888/how-to-create-batch-file-that-delete-all-the-folders-named-bin-or-obj-recursi/201892#201892">этот ответ</a> на superuser.com</p>

<p>я использую, чтобы всегда добавлять новую цель в мои решения для достижения этой цели.</p><pre><code><target name="clean\_folders"> <removedir directories=".\projectname\bin" /> <removedir directories=".\projectname\obj" /> <removedir directories="$(projectvarname)bin" /> <removedir directories="$(projectvarname)\obj" /> </target> </code></pre><p>и вы можете позвонить из командной строки</p><pre><code>msbuild /t:clean\_folders </code></pre><p>это может быть ваш командный файл.</p><pre><code>msbuild /t:clean\_folders pause </code></pre>

<p>я написал <a href="https://github.com/doblak/ps-clean">скрипт powershell</a> , чтобы сделать это. </p><p>преимущество заключается в том, что он выводит сводные данные об удаленных папках и игнорирует их, если вы указали какую-либо иерархию подпапок, которую следует игнорировать.</p><p><img src="https://i.stack.imgur.com/60mpj.png" alt="output example"></p>

<p>ничто не сработало для меня. мне нужно было удалить все файлы в папках bin и obj для отладки и выпуска. мое решение:</p><p>1. щелкните правой кнопкой мыши по проекту, выгрузите, снова щелкните правой кнопкой мыши, отредактируйте, перейдите вниз</p><p>2.insert</p><pre><code><target name="deletebinobjfolders" beforetargets="clean"> <removedir directories="..\..\publish" /> <removedir directories=".\bin" /> <removedir directories="$(baseintermediateoutputpath)" /> </target> 3. сохранить, перезагрузить проект, щелкнуть правой кнопкой мыши очистить и 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> вот статья: <a href="http://kitsula.com/article/how-to-remove-bin-obj-folder-before-build-deploy">как удалить папку bin и/или obj перед сборкой или развертыванием 

посмотрите на <a href="http://wf.codeplex.com/wikipage?title=clean%20project%20overview">cleanproject , он удалит папки bin, папки obj, testresults и resharper. исходный код также доступен.

очень похоже на скрипты стива powershell. я просто добавил testresults и пакеты, так как это необходимо для большинства проектов.get-childitem . -include bin,obj,packages,testresults -recurse | foreach ($\_) { remove-item $_.fullname -force -recurse } 

 <a href="https://stackoverflow.com/a/12206011/25812">вот ответ я дал на аналогичный вопрос: простой, легкий, работает довольно хорошо и не требует ничего другого, кроме того, что у вас уже есть в visual studio.как уже отвечали другие, clean удалит все артефакты, сгенерированные сборкой. но это оставит позади все остальное.если у вас есть какие-то настройки в вашем проекте msbuild, это может привести к проблемам и оставить позади то, что вы могли бы удалить.вы можете обойти эту проблему, просто изменив свой.  proj, добавив его где-то ближе к концу:<target name="spicnspan" aftertargets="clean"> <removedir directories="$(outdir)"/> </target> </code></pre><p>который удалит все в вашей папке bin текущей платформы/конфигурации.</p>

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

<p>from <a href="http://blog.smoura.com/using-windows-powershell-to-remove-obj-bin-and-resharper-folders/">использование windows powershell для удаления папок obj, bin и resharper</a> </p><p>очень похоже на <a href="https://stackoverflow.com/a/5924807/184572">robert h answer</a> с более коротким синтаксисом </p><ol> <li>запустить powershell</li> <li><strong>cd</strong> (изменить каталог) в корневой каталог вашего проекта</li> <li><p>вставьте и запустите приведенный ниже скрипт</p> <p><strong>dir.\-включить bin, obj, <em>resharper * -recurse | foreach ($) {rd $ \_. полное имя –recurse –force}</strong></p></li> </ol>

<p>на нашем сервере сборки мы явно удаляем каталоги bin и obj с помощью скриптов nant. </p><p>каждый скрипт сборки проекта отвечает за свои выходные/временные каталоги. так хорошо работает. поэтому, когда мы меняем проект и добавляем новый, мы основываем сценарий на рабочем сценарии, и вы замечаете этап удаления и заботитесь о нем.</p><p>если вы делаете это на своем компьютере для разработки логики, я бы придерживался правил очистки в visual studio, как уже упоминали другие.</p>

<p>я использую небольшую модификацию <a href="https://stackoverflow.com/a/5924807/6891713">robert h</a> , которая пропускает ошибки и печатает удаленные файлы. обычно я также очищаю папки <code>.vs</code>, <code>\_resharper</code> и <code>package</code>:</p><pre><code>get-childitem -include bin,obj,packages,'\_resharper.caches','.vs' -force -recurse | foreach ($_) { remove-item $\_.fullname -force -recurse -erroraction silentlycontinue -verbose} </code></pre><p>также стоит отметить команду <code>git</code>, которая очищает все изменения, включая игнорируемые файлы и каталоги:</p><pre><code>git clean -dfx </code></pre>

<p>на самом деле, вы можете пойти дальше к ps-предложению и создать файл vbs в каталоге проекта следующим образом:</p><pre><code>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 </code></pre><p>в целях безопасности я включил параметр -whatif, поэтому удалите его, если вы удовлетворены списком при первом запуске.</p>

<p> <a href="http://vsclean.codeplex.com/">http://vsclean.codeplex.com/</a> </p><blockquote> <p>инструмент командной строки, который находит visual студия решений и запускает clean командовать им. это позволяет вам чистить вверх по каталогам/bin/* всех этих старые проекты у вас валяются ваш жесткий диск</p> </blockquote>

<p>это мой командный файл, который я использую для рекурсивного удаления всех папок bin и obj. </p><ol> <li>создайте пустой файл и назовите его<em> deletebinobjfolders.bat </em></li> <li>скопируйте и вставьте приведенный ниже код в<em> deletebinobjfolders.bat </em></li> <li>переместите файл<em> deletebinobjfolders.bat </em>в ту же папку, где находится файл вашего решения (* .sln).</li> </ol><pre class="lang-sh prettyprint-override"><code>@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 </code></pre>

<p>для решения в партии. я использую следующую команду: </p><p><code>for /d /r %%g in (obj,bin) do @if exist %%g if %%~ag geq d rmdir /s /q "%%g"</code> </p><hr><p>причина не использования <code>dir /s /ad /b xxx</code><br> 1. <code>dir /s /ad /b obj</code> вернет пустой список (по крайней мере, на моем windows10) <a href="https://i.stack.imgur.com/knj0w.png"> <img src="https://i.stack.imgur.com/knj0w.png" alt="enter image description here"> </a> <br> 2. <code>dir /s /ad /b *obj</code> будет содержать результат, который не ожидается (папка tobj) <a href="https://i.stack.imgur.com/cu5a8.png"> <img src="https://i.stack.imgur.com/cu5a8.png" alt="enter image description here"> </a> </p>

<p>я действительно ненавижу файлы obj, засоряющие исходные деревья. я обычно настраиваю проекты так, чтобы они выводили файлы obj за пределы исходного дерева. для проектов c # я обычно использую</p><pre><code> <intermediateoutputpath>..\..\obj\$(assemblyname)$(configuration)\</intermediateoutputpath> </code></pre><p>для проектов c++ </p><pre><code> intermediatedirectory="..\..\obj\$(projectname)$(configurationname)" </code></pre>

<p>у нас есть большие файлы .sln со многими файлами проекта. я начал политику наличия директории «viewlocal», в которой находятся все неконтролируемые файлы. внутри этого каталога находится каталог inter и out. для промежуточных файлов и выходных файлов соответственно.</p><p>это, очевидно, позволяет легко перейти в каталог 'viewlocal' и выполнить простое удаление, чтобы избавиться от всего.</p><p>прежде чем вы потратите время на поиск способа обойти это с помощью сценариев, вы можете подумать о создании чего-то подобного.</p><p>хотя я не буду лгать, поддержание такой настройки в большой организации оказалось… интересным. особенно, когда вы используете такие технологии, как qt, которые любят обрабатывать файлы и создавать неконтролируемые исходные файлы. но это целая другая история!</p>

<p>это хорошо работает для меня: начать для/д/р. %% d в (bin, obj, clientbin, generated\_code) действительно ли @if существует "%% d" rd/s/q "%% d"</p>

<p>учитывая, что файл ps1 присутствует в currentfolder (папка, в которой вам нужно удалить папки bin и obj)</p><pre><code>$currentpath = $myinvocation.mycommand.path $currentfolder = split-path $currentpath get-childitem $currentfolder -include bin,obj -recurse | foreach ($\_) { remove-item $\_.fullname -force -recurse } </code></pre>

<p>очень быстрый и безболезненный способ - использовать утилиту <code>rimraf</code> npm, сначала установите ее глобально:</p><pre><code>> npm i rimraf -g </code></pre><p>и тогда команда из корня вашего проекта довольно проста (которую можно сохранить в файле скрипта):</p><pre><code>projectroot> rimraf **/bin **/obj </code></pre><p>чтобы оптимизировать желаемый эффект, вы можете использовать цели проекта (вы можете использовать <code>beforerebuild</code> и запустить предыдущую команду), которые указаны в документации: <a href="https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2017">https://docs.microsoft.com/en-us/visualstudio/msbuild/как продлить визуальный процесс создания студии? view = vs-2017</a> </p><p>мне нравится утилита rimraf, так как она кроссплатформенная и очень быстрая. но вы также можете использовать команду <code>removedir</code> в .csproj, если решите использовать опцию target event. подход <code>removedir</code> был хорошо объяснен в другом ответе здесь @shaman: <a href="https://stackoverflow.com/a/22306653/1534753">https://stackoverflow.com/a/22306653/1534753</a> </p>