Tôi muốn xóa tất cả các thư mục bin và obj để buộc tất cả các dự án xây dựng lại mọi thứ


262

Tôi làm việc với nhiều dự án và tôi muốn xóa đệ quy tất cả các thư mục có tên 'bin' hoặc 'obj' theo cách đó tôi chắc chắn rằng tất cả các dự án sẽ xây dựng lại mọi thứ (đôi khi đó là cách duy nhất để buộc Visual Studio quên đi tất cả về trước đó xây dựng).

Có cách nào nhanh chóng để thực hiện việc này (ví dụ với tệp .bat) mà không phải viết chương trình .NET không?


25
Sẽ thật tuyệt nếu Build-> Clean Solution thực sự đã làm điều này.
Dustin Andrew

Câu trả lời:


411

Điều này phụ thuộc vào vỏ bạn thích sử dụng.

Nếu bạn đang sử dụng shell cmd trên Windows thì các thao tác sau sẽ hoạt động:

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"

Nếu bạn đang sử dụng shell kiểu bash hoặc zsh (chẳng hạn như git bash hoặc babun trên Windows hoặc hầu hết các shell Linux / OS X) thì đây là cách dễ dàng hơn, ngắn gọn hơn để làm những gì bạn muốn:

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

và điều này có thể được giảm xuống thành một dòng với OR:

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

Lưu ý rằng nếu thư mục tên tệp của bạn chứa dấu cách hoặc dấu ngoặc kép, find sẽ gửi các mục nhập đó theo nguyên trạng, xargs có thể chia thành nhiều mục. Nếu hệ vỏ của bạn hỗ trợ chúng -print0-0sẽ hoạt động trong thời gian ngắn này, vì vậy các ví dụ trên trở thành:

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

và:

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

Nếu bạn đang sử dụng Powershell thì bạn có thể sử dụng điều này:

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

như đã thấy trong câu trả lời của Robert H bên dưới - chỉ cần đảm bảo rằng bạn cung cấp cho anh ấy tín dụng cho câu trả lời quyền hạn chứ không phải tôi nếu bạn chọn bỏ phiếu bất cứ điều gì :)

Tất nhiên sẽ là khôn ngoan khi chạy bất kỳ lệnh nào bạn chọn ở nơi an toàn trước tiên để kiểm tra nó!


5
thx cho câu trả lời của bạn. Tôi gặp lỗi: %% G không mong đợi tại thời điểm này.
MichaelD

Hmm thật kỳ lạ - nó hoạt động tốt trên máy của tôi (doanh nghiệp vista 64 bit) - Tôi cũng sẽ thử nó trên máy xp.
Steve Willcock

48
"%% G không mong đợi tại thời điểm này" - điều này xảy ra khi bạn chạy nó từ dòng lệnh thay vì từ bên trong một tệp bó. Sử dụng đơn '%' trong trường hợp này.
Designpotype

4
+1 Bạn có phiền để giải thích mã cho tôi không? Xin vui lòng.
FiberOptics 6/214

2
@SteveWillcock Tốt hơn là sạch. Clean sẽ không loại bỏ các dll không được tham chiếu trong dự án nữa (phần còn lại).
Piotr Szmyd

255

Tôi tìm thấy chủ đề này và có bingo. Tìm kiếm thêm một chút đã bật kịch bản shell power này:

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

Tôi nghĩ tôi muốn chia sẻ, xem xét rằng tôi đã không tìm thấy câu trả lời khi tôi đang tìm kiếm ở đây.


@Nigel, không phải giải pháp này cực kỳ không hiệu quả sao? Tại sao không viết một tập lệnh C tùy chỉnh có thể chạy với tốc độ gấp 10 lần?
Pacerier

37
Bạn không cần foreach - bạn chỉ cần có thể chuyển thẳng gci vào mục gỡ bỏ (tức là gci -include bin,obj -recurse | remove-item -force -recurse)
Chris J

1
Tôi cũng cần loại trừ các thư mục khỏi đường tìm kiếm và tôi thích -WhatIfcờ để kiểm tra trước, vì vậy tôi đã kết thúc việc này: $foldersToRemove='bin','obj';[string[]]$foldersToIgnore='ThirdParty';Get-ChildItem .\ -Include $foldersToRemove -Recurse|Where-Object{$_.FullName -inotmatch "\\$($foldersToIgnore -join '|')\\"}|Remove-Item -Force -Recurse -WhatIf(một chút lộn xộn ở đây là một dòng :))
Johny Skovdal

@ChrisJ Xem xét thêm một câu trả lời mới với giải pháp của bạn.
granadaCoder

66

Điều này làm việc cho tôi:

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

Dựa trên câu trả lời này trên superuser.com


1
Tuyệt vời, và dễ dàng để mở rộng. Tôi sử dụng cho / d / r. %% d trong (bin, obj, App_Data, gói) do @if tồn tại "%% d" rd / s / q "%% d"
RickAndMSFT

3
@ParoX bạn cần chạy nó trong tệp .bat
James L

33

Tôi sử dụng để luôn luôn thêm một mục tiêu mới vào các giải pháp của mình để đạt được điều này.

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

Và bạn có thể gọi nó từ dòng lệnh

msbuild /t:clean_folders

Đây có thể là tập tin hàng loạt của bạn.

msbuild /t:clean_folders
PAUSE

Điều này không hoạt động đối với tệp sln vì bạn không thể gọi các mục tiêu tùy chỉnh trên chúng hoặc bạn có biết cách giải quyết cho việc này không
Piotr Owsiak

3
@PiotrOwsiak vâng, bạn cần tạo tệp "trước.MySlnFileName.sln.target" trong cùng thư mục nơi bạn có .sln của mình và đặt ở đó các định nghĩa mục tiêu của bạn
Endrju

2
bạn có thể thêm AfterTarget = "Clean" làm thuộc tính cho Target, nó sẽ tự động được gọi sau Clean được gọi trực tiếp hoặc gián tiếp khi thực hiện xây dựng lại
Newtopian

29

Tôi đã viết một kịch bản powershell để làm điều đó.

Ưu điểm là nó in ra một bản tóm tắt các thư mục đã xóa và các thư mục bị bỏ qua nếu bạn chỉ định bất kỳ phân cấp thư mục con nào sẽ bị bỏ qua.

Ví dụ đầu ra


1
+1 rất hay! Chỉ cần phát hiện ra rằng chúng ta thực sự có thể gỡ lỗi và xem các biến như trình gỡ lỗi tìm nạp đầy đủ trong Window Power Shell!
wiz -_- lee

Tôi thích giải pháp này. Tôi không phải gặp rắc rối với Visual Studio và tôi có thể chạy nó khi tôi muốn. Rất đẹp!
Halcyon

Hoàn toàn phù hợp với nhu cầu của tôi, nhưng tôi không chắc tại sao điều này không thể là ý chính thay vì repo toàn diện. :-)
Dan Atkinson

Công việc tốt đẹp! Tôi sẽ bỏ qua tất cả các thư mục quét bởi vì khi bạn có hàng ngàn thư mục con, điều này có thể khá chậm. Giá quá cao chỉ để thống kê :-). Ngoài ra tôi sẽ thêm $_ -notmatch 'node_modules'điều kiện vào $FoldersToRemoveđịnh nghĩa biến
Tomino

16

Không có gì làm việc cho tôi. Tôi cần xóa tất cả các tệp trong thư mục bin và obj để gỡ lỗi và phát hành. Giải pháp của tôi:

1.Right click dự án, dỡ tải, nhấp chuột phải một lần nữa chỉnh sửa, đi đến dưới cùng

2. Nhập

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

3. Lưu, tải lại dự án, nhấp chuột phải sạch sẽ và uy tín.


13

Một cái gì đó như thế sẽ làm điều đó một cách khá thanh lịch, sau khi mục tiêu sạch:

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

7

Để xóa bin và obj trước khi xây dựng thêm vào tệp dự án:

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

Đây là bài viết: Cách xóa thư mục bin và / hoặc obj trước khi xây dựng hoặc triển khai


1
Bạn sẽ chỉ muốn làm điều này trên một xây dựng lại, mặc dù. Trừ khi bạn muốn mọi công trình được xây dựng lại!
Josh M.

4

Rất giống với kịch bản PowerShell của Steve. Tôi chỉ thêm TestResults và gói cho nó vì nó cần thiết cho hầu hết các dự án.

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



3

Một cách rất nhanh chóng và không đau đớn là sử dụng rimraftiện ích npm, trước tiên hãy cài đặt nó trên toàn cầu:

> npm i rimraf -g

Và sau đó, lệnh từ gốc dự án của bạn khá đơn giản (có thể được lưu vào tệp tập lệnh):

projectRoot> rimraf **/bin **/obj

Để tối ưu hóa hiệu ứng mong muốn, bạn có thể tận dụng các mục tiêu sự kiện của dự án (mục tiêu bạn có thể sử dụng là BeforeRebuildvà làm cho nó chạy lệnh trước đó) được chỉ định trong tài liệu: https://docs.microsoft.com/en-us/visualstudio/ msbuild / how-to-extend-the-visual-studio-build-process? view = vs-2017

Tôi thích tiện ích rimraf vì nó là crossplat và thực sự nhanh chóng. Nhưng, bạn cũng có thể sử dụng RemoveDirlệnh trong .csproj nếu bạn quyết định chọn tùy chọn sự kiện đích. Cách RemoveDirtiếp cận đã được giải thích tốt trong một câu trả lời khác ở đây bởi @Shaman: https://stackoverflow.com/a/22306653/1534753


2

Đây là câu trả lời tôi đưa ra cho một câu hỏi tương tự, Đơn giản, dễ dàng, hoạt động khá tốt và không yêu cầu gì khác ngoài những gì bạn đã có với Visual Studio.

Như những người khác đã trả lời, Clean sẽ xóa tất cả các tạo phẩm được tạo bởi bản dựng. Nhưng nó sẽ để lại đằng sau mọi thứ khác.

Nếu bạn có một số tùy chỉnh trong dự án MSBuild của mình, điều này có thể đánh vần rắc rối và để lại những thứ bạn nghĩ rằng nó nên bị xóa.

Bạn có thể khắc phục vấn đề này bằng một thay đổi đơn giản cho. * Proj bằng cách thêm phần này vào đâu đó gần cuối:

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

Sẽ xóa mọi thứ trong thư mục bin của nền tảng / cấu hình hiện tại.


2

Đây là tệp bó mà tôi sử dụng để xóa tất cả các thư mục BIN và OBJ theo cách đệ quy.

  1. Tạo một tệp trống và đặt tên là DeleteBinObjFolders.bat
  2. Sao chép-dán mã dưới đây vào DeleteBinObjFolders.bat
  3. Di chuyển tệp DeleteBinObjFolders.bat trong cùng thư mục với tệp giải pháp (* .sln) của bạ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

Là "sạch" không đủ tốt? Lưu ý rằng bạn có thể gọi msbuild với / t: clean từ dòng lệnh.


7
Quả thực "sạch" là không đủ tốt. Điều này đặc biệt đúng khi sử dụng MEF. "Giải pháp sạch" không loại bỏ các tài liệu tham khảo bạn đã xóa có thể gây ra sự cố khi tải động DLL của thư mục.
Alex

5
Rất nhiều lỗi "hoạt động trên máy của tôi" là do những thứ cũ hoặc bất ngờ ngồi xung quanh trong các thư mục bin / obj không được xóa bằng cách thực hiện "dọn dẹp".
Lu-ca

1

Trên máy chủ xây dựng của chúng tôi, chúng tôi xóa rõ ràng các thư mục bin và obj, thông qua các tập lệnh nant.

Mỗi tập lệnh xây dựng dự án chịu trách nhiệm cho các thư mục đầu ra / temp của nó. Hoạt động độc đáo theo cách đó. Vì vậy, khi chúng tôi thay đổi một dự án và thêm một dự án mới, chúng tôi căn cứ vào kịch bản lệnh và bạn chú ý đến giai đoạn xóa và chăm sóc nó.

Nếu bạn thực hiện nó trên máy phát triển logic, tôi sẽ làm sạch thông qua Visual Studio như những người khác đã đề cập.


đôi khi tôi chỉ cần chắc chắn rằng tất cả các bản dựng là hoàn toàn mới. Tôi không thể tin tưởng vào giải pháp sạch để thực hiện điều đó. Xóa bin và obj thường được chứng minh là đáng tin cậy hơn
MichaelD

Đối với chúng tôi, chỉ các bản dựng từ 'máy xây dựng' được thử nghiệm hoặc được sử dụng trong sản xuất, do đó, các nhà phát triển không phải là 'tất cả các vấn đề loại sạch' và máy chủ bản dựng thực hiện điều đó. Cũng có nghĩa là không cần một nhà phát triển để tạo bản dựng đầy đủ.
Simeon Pilgrim

1
Cách dễ nhất để làm điều này với nant là gì? Tôi có một hệ thống phân cấp của một vài chục dự án và tôi không muốn sử dụng tập lệnh xóa. =)
mpontillo

Chúng tôi có nhiều tài sản thực thi / dlls 'được xây dựng, vì vậy trên mỗi tài sản, chúng tôi có một tập lệnh cần thiết để xây dựng nó. Đối với mỗi cái có một phần Xóa trong đó chúng tôi đặt một dòng cho mỗi thư mục bin / obj gỡ lỗi / phát hành mà chúng tôi muốn xóa.
Simeon Pilgrim

1

Tôi thực sự ghét các tập tin obj xả rác cây nguồn. Tôi thường thiết lập các dự án để chúng xuất ra các tệp obj bên ngoài cây nguồn. Đối với các dự án C # tôi thường sử dụng

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

Đối với các dự án C ++

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

1

http://vsclean.codeplex.com/

Công cụ dòng lệnh tìm các giải pháp Visual Studio và chạy lệnh Clean trên chúng. Điều này cho phép bạn dọn sạch các thư mục / bin / * của tất cả các dự án cũ mà bạn đang nằm trên ổ cứng của bạn


1

Bạn thực sự có thể đưa đề xuất PS xa hơn một chút và tạo tệp vbs trong thư mục dự án như thế này:

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

Để an toàn, tôi đã bao gồm tham số -What If, vì vậy hãy xóa nó nếu bạn hài lòng với danh sách trong lần chạy đầu tiên.


1

Tôi sử dụng một sửa đổi nhỏ của Robert H để bỏ qua lỗi và in các tệp xóa. Tôi usally cũng rõ ràng .vs, _resharperpackagethư mục:

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

Cũng đáng lưu ý là gitlệnh xóa tất cả các thay đổi bao gồm các tệp và thư mục bị bỏ qua:

git clean -dfx

0

Chúng tôi có một tệp .SLN lớn với nhiều tệp dự án. Tôi đã bắt đầu chính sách có một thư mục "ViewLocal" nơi chứa tất cả các tệp không được kiểm soát. Bên trong thư mục đó là thư mục 'Inter' và 'Out'. Đối với các tệp trung gian và các tệp đầu ra, tương ứng.

Điều này rõ ràng giúp bạn dễ dàng chỉ cần vào thư mục 'viewlocal' của bạn và thực hiện xóa đơn giản, để loại bỏ mọi thứ.

Trước khi bạn dành thời gian tìm ra cách khắc phục vấn đề này với các tập lệnh, bạn có thể nghĩ về việc thiết lập một cái gì đó tương tự.

Mặc dù vậy, tôi sẽ không nói dối, việc duy trì thiết lập như vậy trong một tổ chức lớn đã chứng tỏ .... thú vị. Đặc biệt là khi bạn sử dụng các công nghệ như QT muốn xử lý tệp và tạo tệp nguồn không được kiểm soát. Nhưng đó là một câu chuyện hoàn toàn KHÁC!


0

Xem xét tệp PS1 có trong currentFolder (thư mục mà bạn cần xóa các thư mục bin và obj)

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

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

0

Đối với các giải pháp trong lô. Tôi đang sử dụng lệnh sau:

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


Lý do không sử dụng DIR /S /AD /B xxx
1. DIR /S /AD /B objsẽ trả về danh sách trống (ít nhất là trên Windows10 của tôi) 2. sẽ chứa kết quả không như mong đợi (thư mục tobj) nhập mô tả hình ảnh ở đây
DIR /S /AD /B *objnhập mô tả hình ảnh ở đây


@IF EXIST %%G IF %%~aG geq dđược sử dụng để kiểm tra đường dẫn hiện có và đường dẫn là một thư mục không phải là tệp.
xianyi

0

Điều này hoạt động tốt cho tôi: bắt đầu cho / d / r. %% d trong (bin, obj, ClientBin, Generated_Code) do @if tồn tại "%% d" rd / s / q "%% d"


0

Tôi sử dụng tập tin .bat với dấu phẩy này để làm điều đó.

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

Tôi nghĩ bạn có thể nhấp chuột phải vào giải pháp / dự án của bạn và nhấp vào nút "Làm sạch".

Theo như tôi nhớ thì nó đã hoạt động như thế. Bây giờ tôi không có VS.NET bên mình nên không thể kiểm tra.


Điều đó đúng, và cho đến nay là giải pháp đơn giản và dễ nhất trong tất cả các giải pháp được đề xuất (giả sử nó phù hợp với tình huống cụ thể ....)
Chris Halcrow

8
Xin lỗi, nhưng điều này chỉ đơn giản là không đúng sự thật. Nó không xóa nội dung của / obj là gốc của vấn đề. Ít nhất đây là tình huống với bản cập nhật VS 2013 3.
Ognyan Dimitrov

Cũng gặp vấn đề tương tự với bản cập nhật VS2013 4. (Lưu ý: VS2010 hoạt động tốt)
juFo

Xem câu trả lời này (về câu hỏi rất giống nhau này) để được giải thích rõ hơn: stackoverflow.com/a/18317221/374198
Josh M.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.