Tüm projeleri her şeyi yeniden oluşturmaya zorlamak için tüm bin ve obj klasörlerini silmek istiyorum


262

Birden fazla proje ile çalışıyorum ve 'bin' veya 'obj' adıyla tüm klasörleri özyinelemeli olarak silmek istiyorum, bu şekilde tüm projelerin her şeyi yeniden oluşturacağından eminim (bazen Visual Studio'yu öncekileri unutmaya zorlamanın tek yolu budur ) oluşturur.

Bir .NET programı yazmak zorunda kalmadan bunu (örneğin .bat dosyasıyla) gerçekleştirmenin hızlı bir yolu var mı?


25
Build-> Clean Solution bunu gerçekten yapsaydı iyi olurdu.
Dustin Andrews

Yanıtlar:


411

Bu, kullanmayı tercih ettiğiniz kabuğa bağlıdır.

Windows'ta cmd kabuğunu kullanıyorsanız, aşağıdakilerin çalışması gerekir:

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"

Bir bash veya zsh tipi kabuk kullanıyorsanız (Windows veya Linux / OS X mermilerinde git bash veya babun gibi), bu istediğinizi yapmanın çok daha güzel, daha özlü bir yoludur:

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

ve bu bir OR ile bir satıra indirilebilir:

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

Dosya adları dizinleriniz boşluk veya tırnak içeriyorsa, find bu girişleri olduğu gibi gönderir ve bu xargs birden çok girişe bölünebilir. Kabuğunuz onları destekliyorsa -print0ve -0bu kısa sürede çalışacaksa, yukarıdaki örnekler olur:

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

ve:

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

Powershell kullanıyorsanız bunu kullanabilirsiniz:

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

Robert H'nin aşağıdaki cevabında görüldüğü gibi - sadece bir şeyi oylamayı seçerseniz benden ziyade powershell cevabı için kredi verdiğinizden emin olun :)

Elbette, test etmek için önce güvenli bir yerde seçtiğiniz komutu çalıştırmak akıllıca olacaktır!


5
Cevabınız için teşekkürler. Bir hata alıyorum: %% G şu anda beklenmiyordu.
MichaelD

Hmm bu garip - makinemde iyi çalışıyor (vista 64bit iş) - Ben de bir xp makinesinde deneyeceğim.
Steve Willcock

48
"%% G şu anda beklenmedikti" - bu, bunu bir toplu iş dosyası yerine komut satırından çalıştırdığınızda olur. Bu durumda tek '%' kullanın.
Designpattern

4
+1 Kodu benim için açıklamak ister misiniz? Lütfen.
fiberOptics

2
@SteveWillcock Temiz olmaktan daha iyi. Temiz artık projede başvurulan dll (artıklar) kaldırmaz.
Piotr Szmyd

255

Bu konuyu buldum ve bingo aldım. Biraz daha arama bu power shell betiğini ortaya çıkardı:

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

Buraya bakarken yanıtı bulamadığımı düşünerek paylaşacağımı düşündüm.


@Nigel, Bu çözüm son derece performanssız değil mi? Neden 10 kat daha hızlı çalışabilen özel bir C komut dosyası yazmıyorsunuz?
Pacerier

37
Foreach'a ihtiyacınız yok - sadece gci'yi doğrudan kaldır-öğeye (örn. gci -include bin,obj -recurse | remove-item -force -recurse) Aktarabilmelisiniz
Chris J

1
Ayrıca klasörleri arama yolundan hariç tutmam gerekiyordu ve -WhatIfilk olarak bayrağı test etmeyi seviyorum , bu yüzden bununla $foldersToRemove='bin','obj';[string[]]$foldersToIgnore='ThirdParty';Get-ChildItem .\ -Include $foldersToRemove -Recurse|Where-Object{$_.FullName -inotmatch "\\$($foldersToIgnore -join '|')\\"}|Remove-Item -Force -Recurse -WhatIfbitirdim : (burada bir satır olarak biraz dağınık :))
Johny Skovdal

@ChrisJ Çözümünüze yeni bir yanıt eklemeyi düşünün.
granadaCoder

66

Bu benim için çalıştı:

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

Superuser.com'daki bu cevaba dayanarak


1
Harika ve uzatılması kolay. / D / r için kullanıyorum. %% d inç (bin, obj, App_Data, paketler) @if varsa "%% d" rd / s / q "%% d"
RickAndMSFT

3
@ParoX bir .bat dosyası içinde çalıştırmanız gerekir
James L

33

Bunu başarmak için çözümlerime her zaman yeni bir hedef eklemek için kullanıyorum.

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

Ve komut satırından arayabilirsiniz

msbuild /t:clean_folders

Bu toplu iş dosyanız olabilir.

msbuild /t:clean_folders
PAUSE

Bu, özel hedefleri çağıramayacağınız için bir sln dosyası için çalışmıyor veya bunun için bir geçici çözüm biliyor musunuz
Piotr Owsiak

3
@PiotrOwsiak evet, .sln'nizle aynı dizinde "before.MySlnFileName.sln.targets" dosyasını oluşturmanız ve orada hedef tanımlarınızı koymanız gerekir
Endrju

2
AfterTargets = "Clean" öğesini Hedefe öznitelik olarak ekleyebilirsiniz, yeniden oluşturma yaparken doğrudan veya dolaylı olarak çağrılan
Clean'ten

29

Bunu yapmak için bir powershell betiği yazdım .

Avantajı, yok sayılacak herhangi bir alt klasör hiyerarşisi belirttiyseniz, silinen klasörlerin ve yok sayılan klasörlerin bir özetini yazdırmasıdır.

Çıktı örneği


1
+1 çok güzel! Az önce hata ayıklayabildiğimizi ve Windows Power Shell'de tam getirilen bir hata ayıklayıcı gibi değişkenleri görebildiğimizi öğrendim!
wiz -_- lee

Bu çözümü seviyorum. Visual Studio ile uğraşmak zorunda değilim ve bunu istediğim zaman çalıştırabilirim. Çok hoş!
Halcyon

İhtiyaçlarıma mükemmel bir şekilde uyuyor, ancak bunun neden tam bir repo yerine bir gist olamayacağından emin değilim. :-)
Dan Atkinson

İyi iş! Binlerce alt dizininiz olduğunda, bu oldukça yavaş olabilir, çünkü tüm dizinleri taramayı atlarım. Sadece istatistikler için çok yüksek fiyat :-). Ayrıca değişken tanımına $_ -notmatch 'node_modules'koşul $FoldersToRemove
eklerdim

16

Benim için hiçbir şey işe yaramadı. Hata ayıklama ve serbest bırakma için bin ve obj klasörlerindeki tüm dosyaları silmem gerekiyordu. Çözümüm:

1. sağ tıklayın proje, boşaltın, tekrar sağ tıklayın düzenleme, aşağı gidin

2.Insert

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

3. Projeyi kaydedin, yeniden yükleyin, sağ tıklayın temiz ve presto.


13

Böyle bir şey, temiz bir hedeften sonra, oldukça zarif bir şekilde yapmalıdır:

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

7

Derlemeden önce bin ve obj silmek için proje dosyasına ekleyin:

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

Makale: Derleme ve / veya obj klasörü oluşturma veya dağıtmadan önce nasıl kaldırılır


1
Ancak bunu sadece bir yeniden oluşturmada yapmak isteyeceksiniz. Her yapının bir yeniden inşa olmasını istemiyorsanız !
Josh M.

4

Steve'in PowerShell betiklerine çok benzer. TestResults ve paketleri ekledim, çünkü çoğu proje için gerekli.

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



3

Çok hızlı ve ağrısız bir yol, rimrafnpm yardımcı programını kullanmak, önce küresel olarak kurmaktır:

> npm i rimraf -g

Ve sonra proje kökünüzden komut oldukça basittir (bir komut dosyasına kaydedilebilir):

projectRoot> rimraf **/bin **/obj

İstenen efekti optimize etmek BeforeRebuildiçin dokümanlarda belirtilen proje olay hedeflerinden (kullanabileceğiniz ve önceki komutu çalıştırmasını sağlayabilirsiniz) yararlanabilirsiniz: https://docs.microsoft.com/en-us/visualstudio/ msbuild / nasıl-uzatmak-yayınların-stüdyo birikmesi işlemi? görünüşüdür vs =-2017

Crossplat ve gerçekten hızlı olduğu gibi rimraf yardımcı programı gibi. Ancak, RemoveDirhedef olay seçeneğiyle gitmeye karar verirseniz, .csproj dosyasındaki komutu da kullanabilirsiniz . RemoveDirYaklaşım iyi @Shaman tarafından burada başka bir cevap açıklandı: https://stackoverflow.com/a/22306653/1534753


2

İşte benzer bir soruya verdiğim cevap , Basit, kolay, oldukça iyi çalışıyor ve Visual Studio ile olandan başka bir şey gerektirmiyor.

Diğerleri zaten yanıt verdikleri gibi Clean, yapı tarafından oluşturulan tüm yapay nesneleri kaldıracaktır. Ama her şeyin arkasında kalacak.

MSBuild projenizde bazı özelleştirmeler varsa, bu sorun büyüyebilir ve silinmesi gerektiğini düşündüğünüz şeyleri geride bırakabilir.

Bu sorunu sonuna kadar bir yere ekleyerek. * Projenizde basit bir değişiklik yaparak atlayabilirsiniz:

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

Bu, geçerli platformun / yapılandırmanın bin klasörünüzdeki her şeyi kaldıracaktır.


2

Bu, tüm BIN ve OBJ klasörlerini tekrar tekrar silmek için kullandığım toplu iş dosyam.

  1. Boş bir dosya oluşturun ve bu dosyayı DeleteBinObjFolders.bat olarak adlandırın
  2. Aşağıdaki kodu CopyBinObjFolders.bat dosyasına kopyalayıp yapıştırın
  3. DeleteBinObjFolders.bat dosyasını çözüm (* .sln) dosyanızla aynı klasöre taşıyın .
@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

'Temiz' yeterince iyi değil mi? Komut satırından msbuild / t: clean ile çağırabileceğinizi unutmayın.


7
Gerçekten de "temiz" yeterince iyi değil. Bu özellikle MEF kullanılırken geçerlidir. "Temiz Çözüm", bir klasörün DLL'lerini dinamik olarak yüklerken sorunlara neden olabilecek, kaldırdığınız referanslardan kurtulmaz.
Alex

5
"Makinemde çalışır" hatalarının birçoğuna "temiz" yapılarak kaldırılmayan bin / obj klasörlerinde oturan eski veya beklenmedik şeyler neden olur.
Luke

1

Yapım sunucumuzda, bin ve obj dizinlerini nant komut dosyaları aracılığıyla açıkça sileriz.

Her proje derleme betiği çıktı / geçici dizinlerinden sorumludur. Bu şekilde güzel çalışıyor. Bu nedenle, bir projeyi değiştirip yeni bir proje eklediğimizde, komut dosyasını çalışan bir komut dosyasına dayandırırız ve silme aşamasını fark edip onunla ilgilenirsiniz.

Bunu mantık geliştirme makinenizde yapıyorsanız, diğerlerinin de belirttiği gibi Visual Studio ile temizlemeye devam edeceğim.


Bazen tüm yapıların tamamen yeni olduğundan emin olmak zorundayım. Bunu yapmak için temiz bir çözüme güvenemiyorum. Silme kutusu ve obj genellikle daha güvenilir olduğunu kanıtladı
MichaelD

Bizim için, sadece 'yapı makinesinden' yapılan yapılar test edilir veya üretimde kullanılır, bu nedenle geliştiricilerin 'tamamen temiz' tipte sorunlar olması gerekmez ve yapı sunucusu bunu yapar. Ayrıca, tam bir yapı oluşturmak için hiç bir geliştiriciye ihtiyaç duyulmadığı anlamına gelir.
Simeon Pilgrim

1
Bunu nant ile yapmanın en kolay yolu nedir? Birkaç düzine projeden oluşan bir hiyerarşim var ve silme komut dosyasında tekleme yapmamayı tercih ediyorum. =)
mpontillo

Birçok executables / dlls 'asset' oluşturduk, bu nedenle varlık başına onu oluşturan bir nant betiğimiz var. Her biri için silinmesini istediğimiz her hata ayıklama / bırakma kutusu / obj dizini için bir satır yerleştirdiğimiz bir Sil bölümü vardır.
Simeon Pilgrim

1

Aslında kaynak ağaçlara çöp obj dosyaları nefret ediyorum. Projeleri genellikle kaynak ağacın dışında obj dosyalarını çıktılar. C # projeleri için genellikle kullanıyorum

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

C ++ projeleri için

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

1

http://vsclean.codeplex.com/

Visual Studio çözümlerini bulan ve üzerinde Clean komutunu çalıştıran komut satırı aracı. Bu, sabit diskinizde bulunan tüm eski projelerin / bin / * dizinlerini temizlemenizi sağlar


1

Aslında PS önerisini biraz daha ileri taşıyabilir ve proje dizininde şöyle bir vbs dosyası oluşturabilirsiniz:

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

Güvenlik için, -WhatIf parametresini ekledim, bu yüzden ilk çalıştırmadaki listeden memnunsanız kaldırın.


1

Robert H'nin hataları atlayan ve silme dosyalarını basan küçük bir modifikasyonunu kullanıyorum . Ben usally da temizlemek .vs, _resharperve packageklasörleri:

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

Ayrıca, dikkate gitalınmayan dosyalar ve dizinler dahil olmak üzere tüm değişiklikleri temizleyen komuttur:

git clean -dfx

0

Birçok proje dosyası içeren büyük bir .SLN dosyamız var. Kaynak denetlenmeyen dosyaların bulunduğu "ViewLocal" dizinine sahip olma ilkesini başlattım. Bu dizinin içinde 'Inter' ve 'Out' dizini bulunur. Ara dosyalar ve çıkış dosyaları için sırasıyla.

Bu açıkça 'viewlocal' dizininize gitmenizi ve her şeyden kurtulmak için basit bir silme işlemini kolaylaştırır.

Komut dosyalarıyla bu sorunu çözmenin bir yolunu bulmak için zaman harcamadan önce, benzer bir şey kurmayı düşünebilirsiniz.

Yine de yalan söylemeyeceğim, büyük bir organizasyonda böyle bir düzeni sürdürmek ... ilginç oldu. Özellikle QT gibi dosyaları işlemek ve kaynak kontrolsüz kaynak dosyaları oluşturmak gibi teknolojileri kullandığınızda. Ama bu tamamen DİĞER bir hikaye!


0

PS1 dosyasının currentFolder'da (bin ve obj klasörlerini silmeniz gereken klasör) bulunduğunu düşünürsek

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

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

0

Toplu çözüm için. Aşağıdaki komutu kullanıyorum:

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. kullanmamanın nedeni DIR /S /AD /B objboş listeyi döndürür (en azından Windows10'umda) 2. beklenmeyen sonucu içerecektir (tobj klasörü) resim açıklamasını buraya girin
DIR /S /AD /B *objresim açıklamasını buraya girin


@IF EXIST %%G IF %%~aG geq dvarolan yolu denetlemek için kullanılır ve yol bir dosya değil bir klasördür.
xianyi

0

Bu benim için iyi çalışıyor: / d / r için başla. %% d in (bin, obj, ClientBin, Generated_Code) "%% d" rd / s / q "%% d" varsa


0

Bunu yapmak için bu commad ile .bat dosyasını kullanıyorum.

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"

-1

Çözüm / projenize sağ tıklayıp "Temizle" düğmesine basabileceğinizi düşünüyorum.

Hatırladığım kadarıyla böyle çalışıyordu. VS.NET'im artık yanımda değil, bu yüzden test edemiyorum.


Bu doğru ve önerilen çözümlerin en basit ve en kolayı (belirli duruma uygun olduğu varsayılarak ....)
Chris Halcrow

8
Üzgünüm, ama bu doğru değil. Sorunun kökü olan / obj içeriğini silmez. En azından VS 2013 güncellemesi 3'teki durum bu.
Ognyan Dimitrov

VS2013 güncelleme 4 ile aynı sorunu yaşadım. (Not: VS2010 iyi
gidiyordu

Daha iyi bir açıklama için bu cevaba bakın (aynı soruda): stackoverflow.com/a/18317221/374198
Josh M.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.