Saya ingin menghapus semua folder bin dan obj untuk memaksa semua proyek membangun kembali semuanya

263

Saya bekerja dengan banyak proyek, dan saya ingin menghapus semua folder secara rekursif dengan nama 'bin' atau 'obj' dengan cara itu saya yakin bahwa semua proyek akan membangun kembali semuanya (kadang-kadang itu satu-satunya cara untuk memaksa Visual Studio melupakan semua tentang sebelumnya membangun).

Apakah ada cara cepat untuk menyelesaikan ini (dengan file .bat misalnya) tanpa harus menulis program .NET?

MichaelD
sumber
25
Akan lebih baik jika Build-> Clean Solution benar-benar melakukan ini.
Dustin Andrews

Jawaban:

412

Ini tergantung pada shell yang Anda inginkan.

Jika Anda menggunakan cmd shell pada Windows maka yang berikut ini akan berfungsi:

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"

Jika Anda menggunakan shell tipe bash atau zsh (seperti git bash atau babun di Windows atau kebanyakan shell Linux / OS X) maka ini adalah cara yang jauh lebih baik, lebih ringkas untuk melakukan apa yang Anda inginkan:

find . -iname "bin" | xargs rm -rf
find . -iname "obj" | xargs rm -rf

dan ini dapat dikurangi menjadi satu baris dengan ATAU:

find . -iname "bin" -o -iname "obj" | xargs rm -rf

Perhatikan bahwa jika direktori nama file Anda berisi spasi atau tanda kutip, find akan mengirim entri tersebut apa adanya, xargs mana yang dapat dibagi menjadi beberapa entri. Jika shell Anda mendukungnya, -print0dan -0akan mengatasi kekurangan ini, maka contoh di atas menjadi:

find . -iname "bin" -print0 | xargs -0 rm -rf
find . -iname "obj" -print0 | xargs -0 rm -rf

dan:

find . -iname "bin" -o -iname "obj" -print0 | xargs -0 rm -rf

Jika Anda menggunakan Powershell maka Anda dapat menggunakan ini:

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

seperti yang terlihat pada jawaban Robert H di bawah ini - pastikan Anda memberinya pujian untuk jawaban PowerShell daripada saya jika Anda memilih untuk memilih-up apa saja :)

Tentu saja akan bijaksana untuk menjalankan perintah apa pun yang Anda pilih di tempat yang aman terlebih dahulu untuk mengujinya!

Steve Willcock
sumber
5
Terima kasih atas jawaban Anda. Saya mendapatkan kesalahan: %% G tidak terduga saat ini.
MichaelD
Hmm itu aneh - ini bekerja dengan baik pada komputer saya (bisnis vista 64bit) - Saya akan mencobanya pada mesin xp juga.
Steve Willcock
48
"%% G tidak terduga saat ini" - ini terjadi ketika Anda menjalankannya dari baris perintah alih-alih dari dalam file batch. Gunakan tunggal '% dalam kasus ini.
Designpattern
4
+1 Maukah Anda menjelaskan kode untuk saya? Silahkan.
fiberOptics
2
@ SeveWillcock Lebih baik daripada bersih. Bersihkan tidak akan menghapus dll yang tidak dirujuk dalam proyek lagi (sisa).
Piotr Szmyd
256

Saya menemukan utas ini dan mendapat bingo. Pencarian lebih banyak muncul skrip shell daya ini:

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

Saya pikir saya akan berbagi, mengingat saya tidak menemukan jawaban ketika saya mencari di sini.

Robert H.
sumber
@ Nigel, bukankah solusi ini sangat tidak performan? Mengapa tidak menulis skrip C khusus yang dapat berjalan pada kecepatan 10x?
Pacerier
37
Anda tidak memerlukan foreach - Anda hanya dapat menyalurkan gci langsung ke remove-item (yaitu, gci -include bin,obj -recurse | remove-item -force -recurse)
Chris J
1
Saya perlu juga mengecualikan folder dari searchpath, dan saya suka -WhatIfbendera untuk menguji pertama, jadi saya berakhir dengan ini: $foldersToRemove='bin','obj';[string[]]$foldersToIgnore='ThirdParty';Get-ChildItem .\ -Include $foldersToRemove -Recurse|Where-Object{$_.FullName -inotmatch "\\$($foldersToIgnore -join '|')\\"}|Remove-Item -Force -Recurse -WhatIf(agak berantakan di sini sebagai satu baris meskipun :))
Johny Skovdal
@ ChrisJ Pertimbangkan untuk menambahkan jawaban baru dengan solusi Anda.
granadaCoder
66

Ini bekerja untuk saya:

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

Berdasarkan jawaban ini di superuser.com

Daniel Rehner
sumber
1
Bagus, dan mudah diperluas. Saya menggunakan untuk / d / r. %% d in (bin, obj, App_Data, paket) do @jika ada "%% d" rd / s / q "%% d"
RickAndMSFT
3
@ParoX Anda harus menjalankannya dalam sebuah file bat
James L
33

Saya selalu menambahkan target baru pada solusi saya untuk mencapai ini.

<Target Name="clean_folders">
  <RemoveDir Directories=".\ProjectName\bin" />
  <RemoveDir Directories=".\ProjectName\obj" />
  <RemoveDir Directories="$(ProjectVarName)\bin" />
  <RemoveDir Directories="$(ProjectVarName)\obj" />
</Target>

Dan Anda dapat memanggilnya dari baris perintah

msbuild /t:clean_folders

Ini bisa menjadi file batch Anda.

msbuild /t:clean_folders
PAUSE
Jhonny D. Cano -Leftware-
sumber
Ini tidak berfungsi untuk file sln karena Anda tidak dapat memanggil target khusus atau mereka tahu solusi untuk ini
Piotr Owsiak
3
@PiotrOwsiak ya, Anda perlu membuat file "before.MySlnFileName.sln.targets" di direktori yang sama di mana Anda memiliki .sln dan letakkan definisi target Anda
Endrju
2
Anda dapat menambahkan AfterTarget = "Bersihkan" sebagai atribut ke Target, itu akan secara otomatis dipanggil setelah Bersihkan yang dipanggil secara langsung atau tidak langsung ketika melakukan pembangunan kembali
Newtopian
29

Saya menulis skrip PowerShell untuk melakukannya.

Keuntungannya adalah ia mencetak ringkasan folder yang dihapus, dan folder yang diabaikan jika Anda menentukan hierarki subfolder yang akan diabaikan.

Contoh keluaran

doblak
sumber
1
+1 sangat bagus! Baru tahu bahwa kita sebenarnya bisa men-debug dan melihat variabel seperti debugger lengkap di Window Power Shell!
wiz -_- lee
Saya suka solusi ini. Saya tidak perlu mengacaukan dengan Visual Studio dan saya dapat menjalankan ini ketika saya mau. Sangat bagus!
Halcyon
Sesuai dengan kebutuhan saya dengan sempurna, tetapi saya tidak yakin mengapa ini tidak bisa menjadi inti daripada repo yang lengkap. :-)
Dan Atkinson
Kerja bagus! Saya akan menghapus semua direktori pemindaian karena ketika Anda memiliki ribuan subdirektori, ini bisa sangat lambat. Harga terlalu tinggi hanya untuk statistik :-). Saya juga akan menambahkan $_ -notmatch 'node_modules'kondisi ke $FoldersToRemovedefinisi variabel
Tomino
16

Tidak ada yang berhasil untuk saya. Saya perlu menghapus semua file di folder bin dan obj untuk debug dan rilis. Solusi saya:

1. Klik kanan proyek, bongkar, klik kanan lagi edit, pergi ke bawah

2.Masukkan

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

3. Simpan, muat ulang proyek, klik kanan clean and presto.

Kdefthog
sumber
13

Sesuatu seperti itu harus melakukannya dengan cara yang cukup elegan, setelah target bersih:

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

Untuk menghapus nampan dan objek sebelum membangun, tambahkan ke file proyek:

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

Inilah artikelnya: Cara menghapus folder bin dan / atau obj sebelum build atau deploy

Dukun
sumber
1
Anda hanya ingin melakukan ini pada pembangunan kembali. Kecuali jika Anda ingin setiap bangunan dibangun kembali!
Josh M.
4

Sangat mirip dengan skrip PowerShell Steve. Saya baru saja menambahkan TestResults dan paket ke sana karena diperlukan untuk sebagian besar proyek.

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

Cara yang sangat cepat dan tidak menyakitkan adalah dengan menggunakan rimrafutilitas npm, instal secara global terlebih dahulu:

> npm i rimraf -g

Dan kemudian perintah dari root proyek Anda cukup sederhana (yang dapat disimpan ke file skrip):

projectRoot> rimraf **/bin **/obj

Untuk mengoptimalkan efek yang diinginkan, Anda dapat memanfaatkan target acara proyek (yang dapat Anda gunakan adalah BeforeRebuilddan membuatnya menjalankan perintah sebelumnya) yang ditentukan dalam dokumen: https://docs.microsoft.com/en-us/visualstudio/ msbuild / bagaimana-untuk-memperpanjang-visual-studio-build-proses? view = vs-2017

Saya suka utilitas rimraf karena crossplat dan sangat cepat. Tapi, Anda juga dapat menggunakan RemoveDirperintah di .csproj jika Anda memutuskan untuk pergi dengan opsi acara target. The RemoveDirPendekatan baik dijelaskan dalam jawaban lain di sini oleh @Shaman: https://stackoverflow.com/a/22306653/1534753

Vedran Mandić
sumber
2

Berikut adalah jawaban yang saya berikan untuk pertanyaan serupa, Sederhana, mudah, berfungsi cukup baik dan tidak memerlukan apa pun selain apa yang sudah Anda miliki dengan Visual Studio.

Ketika orang lain merespons, Bersihkan akan menghapus semua artefak yang dihasilkan oleh build. Tapi itu akan meninggalkan segalanya.

Jika Anda memiliki beberapa penyesuaian dalam proyek MSBuild Anda, ini bisa mengeja masalah dan meninggalkan hal-hal yang menurut Anda harus dihapus.

Anda dapat menghindari masalah ini dengan perubahan sederhana pada proj. * Anda dengan menambahkan ini di akhir:

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

Yang akan menghapus semua yang ada di folder bin Anda dari platform / konfigurasi saat ini.

Newtopian
sumber
2

Ini adalah file batch saya yang saya gunakan untuk menghapus semua folder BIN dan OBJ secara rekursif.

  1. Buat file kosong dan beri nama DeleteBinObjFolders.bat
  2. Salin-tempel kode kode di bawah ini ke DeleteBinObjFolders.bat
  3. Pindahkan file DeleteBinObjFolders.bat di folder yang sama dengan file solusi (* .sln) Anda.
@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
Alper Ebicoglu
sumber
1

Apakah 'bersih' tidak cukup baik? Perhatikan bahwa Anda dapat memanggil msbuild dengan / t: clean dari baris perintah.

Brian
sumber
7
Memang "bersih" tidak cukup baik. Ini terutama benar ketika menggunakan MEF. "Solusi Bersih" tidak menghilangkan referensi yang telah Anda hapus yang dapat menyebabkan masalah saat memuat DLL folder secara dinamis.
Alex
5
Banyak bug "berfungsi pada mesin saya" disebabkan oleh hal-hal lama atau tidak terduga yang ada di folder bin / obj yang tidak dihapus dengan melakukan "pembersihan".
Luke
1

Di server build kami, kami secara eksplisit menghapus direktori bin dan obj, melalui skrip nant.

Setiap skrip build proyek bertanggung jawab atas direktori output / temp itu. Bekerja dengan baik seperti itu. Jadi, ketika kami mengubah proyek dan menambahkan yang baru, kami mendasarkan skrip tersebut dari skrip yang berfungsi, dan Anda memperhatikan tahap hapus dan menanganinya.

Jika Anda melakukannya pada mesin pengembangan logika Anda, saya akan tetap bersih melalui Visual Studio seperti yang orang lain katakan.

Peziarah Simeon
sumber
terkadang saya hanya perlu memastikan bahwa semua build benar-benar baru. Saya tidak dapat mempercayai solusi bersih untuk melakukan itu. Bin dan obj delet sering terbukti lebih dapat diandalkan
MichaelD
Bagi kami, hanya build dari 'build machine' yang diuji, atau digunakan dalam produksi, sehingga pengembang tidak harus memiliki masalah tipe 'all clean', dan build server melakukan itu. Juga berarti tidak ada pengembang yang diperlukan untuk membuat build penuh.
Simeon Pilgrim
1
Apa cara termudah untuk melakukan ini dengan nant? Saya memiliki hierarki beberapa lusin proyek dan saya lebih suka tidak salah membaca skrip penghapusan. =)
mpontillo
Kami memiliki banyak executable / etc 'aset' yang dibangun, jadi per aset kami memiliki skrip asli yang membangunnya. Untuk masing-masing ada bagian Hapus di mana kita menempatkan baris untuk setiap direktori debug / rilis bin / obj yang ingin kita hapus.
Simeon Pilgrim
1

Aku sebenarnya benci file obj yang mengotori pohon sumber. Saya biasanya mengatur proyek sehingga mereka mengeluarkan file obj di luar source tree. Untuk proyek C # biasanya saya gunakan

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

Untuk proyek C ++

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

http://vsclean.codeplex.com/

Alat baris perintah yang menemukan solusi Visual Studio dan menjalankan perintah Bersihkan pada mereka. Ini memungkinkan Anda membersihkan direktori / bin / * dari semua proyek lama yang Anda miliki di hard drive Anda

Joel Martinez
sumber
1

Anda sebenarnya dapat mengambil saran PS sedikit lebih jauh dan membuat file vbs di direktori proyek seperti ini:

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

Demi keamanan, saya telah memasukkan parameter -WhatIf, jadi hapus jika Anda puas dengan daftar tersebut saat pertama kali dijalankan.

KL XL
sumber
1

Saya menggunakan sedikit modifikasi dari Robert H yang melewatkan kesalahan dan mencetak file hapus. Saya biasanya juga menghapus .vs, _resharperdan packagefolder:

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

Juga patut dicatat adalah gitperintah yang menghapus semua perubahan termasuk file dan direktori yang diabaikan:

git clean -dfx
eugstman
sumber
0

Kami memiliki file .SLN besar dengan banyak file proyek. Saya memulai kebijakan memiliki direktori "ViewLocal" di mana semua file yang tidak dikontrol dapat ditemukan. Di dalam direktori itu ada direktori 'Inter' dan 'Out'. Untuk file perantara, dan file output, masing-masing.

Ini jelas membuatnya mudah untuk hanya pergi ke direktori 'viewlocal' Anda dan melakukan penghapusan sederhana, untuk menyingkirkan semuanya.

Sebelum Anda menghabiskan waktu mencari cara untuk mengatasi ini dengan skrip, Anda mungkin berpikir untuk menyiapkan sesuatu yang serupa.

Saya tidak akan berbohong, mempertahankan pengaturan seperti itu dalam organisasi besar telah terbukti .... menarik. Terutama ketika Anda menggunakan teknologi seperti QT yang suka memproses file dan membuat file sumber yang tidak terkontrol. Tapi itu adalah keseluruhan cerita LAINNYA!

pj4533
sumber
0

Mempertimbangkan file PS1 hadir di folder saat ini (folder di mana Anda perlu menghapus folder bin dan obj)

$currentPath = $MyInvocation.MyCommand.Path
$currentFolder = Split-Path $currentPath

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

Untuk solusi dalam batch. Saya menggunakan perintah berikut:

FOR /D /R %%G in (obj,bin) DO @IF EXIST %%G IF %%~aG geq d RMDIR /S /Q "%%G"


Alasan tidak menggunakan DIR /S /AD /B xxx
1. DIR /S /AD /B objakan mengembalikan daftar kosong (setidaknya pada Windows10 saya) 2. akan berisi hasil yang tidak diharapkan (folder tobj) masukkan deskripsi gambar di sini
DIR /S /AD /B *objmasukkan deskripsi gambar di sini

xianyi
sumber
@IF EXIST %%G IF %%~aG geq ddigunakan untuk memeriksa jalur yang ada dan path adalah folder bukan file.
xianyi
0

Ini Bekerja Baik Untuk Saya: mulai untuk / d / r. %% d in (bin, obj, ClientBin, Generated_Code) do @jika ada "%% d" rd / s / q "%% d"

Mudit Sharma
sumber
0

Saya menggunakan file .bat dengan commad ini untuk melakukan itu.

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"
Hacko
sumber
-1

Saya pikir Anda dapat mengklik kanan ke solusi / proyek Anda dan klik tombol "Bersihkan".

Sejauh yang saya ingat itu berfungsi seperti itu. Saya tidak punya VS.NET dengan saya sekarang jadi tidak bisa mengujinya.

dr. jahat
sumber
Itu benar, dan sejauh ini solusi yang paling sederhana dan termudah dari semua yang disarankan (dengan asumsi itu sesuai dengan situasi spesifik ....)
Chris Halcrow
8
Maaf, tapi ini tidak benar. Itu tidak menghapus isi / obj yang merupakan akar masalah. Setidaknya ini adalah situasi dengan pembaruan VS 2013 3.
Ognyan Dimitrov
Hanya memiliki masalah yang sama dengan pembaruan VS2013 4. (Catatan: VS2010 baik-baik saja)
juFo
Lihat jawaban ini (untuk pertanyaan yang sama) untuk penjelasan yang lebih baik: stackoverflow.com/a/18317221/374198
Josh M.