모든 bin 및 obj 폴더를 삭제하여 모든 프로젝트가 모든 것을 다시 작성하도록하고 싶습니다.


262

여러 프로젝트로 작업하고 있으며 이름이 'bin'또는 'obj'인 모든 폴더를 재귀 적으로 삭제하고 싶습니다. 모든 프로젝트가 모든 것을 다시 빌드 할 것이라고 확신합니다 (때로는 Visual Studio가 이전의 모든 것을 잊게하는 유일한 방법입니다) 빌드).

.NET 프로그램을 작성하지 않고도 (예 : .bat 파일을 사용하여)이 작업을 수행하는 빠른 방법이 있습니까?


25
Build-> Clean Solution이 실제로 이렇게하면 좋을 것입니다.
더스틴 앤드류스

답변:


411

이것은 사용하려는 쉘에 따라 다릅니다.

Windows에서 cmd 쉘을 사용하는 경우 다음이 작동합니다.

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 유형 셸 (예 : Windows 또는 대부분의 Linux / OS X 셸의 git bash 또는 babun)을 사용하는 경우 원하는 작업을 수행하는 훨씬 더 간결하고 간결한 방법입니다.

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

OR로 한 줄로 줄일 수 있습니다.

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

파일 이름 디렉토리에 공백이나 따옴표가 포함되어 있으면 find는 해당 항목을있는 그대로 보내며 xargs는 여러 항목으로 분할 될 수 있습니다. 쉘에서 지원하는 그 경우, -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 }

아래의 Robert H의 답변 에서 볼 수 있듯이, 당신이 아무것도 투표하지 않으려는 경우 나 대신 powershell 답변에 대한 크레딧을 제공하십시오. :)

물론 안전한 곳에서 먼저 선택한 명령을 실행하여 테스트하는 것이 좋습니다.


5
당신의 대답을 위해 thx. 오류가 발생했습니다. 현재 %% G가 예기치 않았습니다.
MichaelD

흠 그건 이상합니다-내 컴퓨터에서 잘 작동합니다 (vista 64 비트 비즈니스)-XP 컴퓨터에서도 시도해 봅니다.
Steve Willcock

48
"%% G는 현재 예상치 못한 결과입니다."-배치 파일 대신 명령 줄에서 실행할 때 발생합니다. 이 경우 단일 '%'를 사용하십시오.
디자인 패턴

4
+1 코드를 설명해 주시겠습니까? 부디.
fiberOptics

2
@SteveWillcock 깨끗함보다 낫습니다. Clean은 더 이상 프로젝트에서 참조되지 않은 dll을 제거하지 않습니다 (남은).
Piotr Szmyd 2014

255

나는이 실을 발견하고 빙고를 얻었다. 조금 더 검색하면이 파워 쉘 스크립트가 나타났습니다.

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

나는 내가 여기서보고있을 때 답을 찾지 못했다는 점을 고려하여 공유하고 싶다고 생각했다.


@Nigel,이 솔루션은 성능이 좋지 않습니까? 10 배속으로 실행할 수있는 커스텀 C 스크립트를 작성해보십시오.
Pacerier

37
당신은 foreach는 필요하지 않습니다 - 그냥 (즉, 바로 제거 항목에 파이프 GCI을 할 수 있어야한다 gci -include bin,obj -recurse | remove-item -force -recurse)
크리스 J

1
또한 검색 경로에서 폴더를 제외해야했고 -WhatIf플래그가 먼저 테스트 되는 것을 좋아해서 다음과 같이 끝났습니다. $foldersToRemove='bin','obj';[string[]]$foldersToIgnore='ThirdParty';Get-ChildItem .\ -Include $foldersToRemove -Recurse|Where-Object{$_.FullName -inotmatch "\\$($foldersToIgnore -join '|')\\"}|Remove-Item -Force -Recurse -WhatIf(여기서 한 줄로 약간 지저분합니다.))
Johny Skovdal

@ChrisJ 솔루션으로 새로운 답변을 추가해보십시오.
granadaCoder

66

이것은 나를 위해 일했다 :

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

이 답변 을 기반으로 superuser.com


1
위대하고 쉽게 확장 할 수 있습니다. / d / r에 사용합니다. (bin, obj, App_Data, packages)의 %% d는 @if 존재하는 경우 "%% d"rd / s / q "%% d"
RickAndMSFT

3
@ParoX .bat 파일에서 실행해야합니다
James L

33

나는 이것을 달성하기 위해 항상 솔루션에 새로운 목표를 추가하는 데 사용합니다.

<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

사용자 정의 대상을 호출 할 수 없거나 이에 대한 해결 방법을 알고 있기 때문에 이것은 sln 파일에 대해 작동하지 않습니다.
Piotr Owsiak

3
@PiotrOwsiak 예. .sln이있는 동일한 디렉토리에 "before.MySlnFileName.sln.targets"파일을 작성하고 대상 정의를 작성해야합니다.
Endrju

2
AfterTargets = "Clean"을 대상에 속성으로 추가 할 수 있습니다. 다시 빌드 할 때 직접 또는 간접적으로 호출 된 Clean 후에 자동으로 호출됩니다.
Newtopian

29

나는 그것을하기 위해 powershell 스크립트 를 작성 했습니다.

장점은 삭제 된 폴더의 요약을 인쇄하고 하위 폴더 계층 구조를 무시하도록 지정한 경우 무시한 것입니다.

출력 예


1
+1 아주 좋아요! 우리는 실제로 Windows Power Shell의 전체 가져 오기 디버거와 같은 변수를 디버깅하고 볼 수 있음을 알았습니다!
wiz -_- lee

나는이 해결책을 좋아한다. Visual Studio를 망칠 필요가 없으며 원하는 때 실행할 수 있습니다. 아주 좋아요!
Halcyon

내 필요에 완벽하게 부합하지만 왜 이것이 완전한 저장소가 아닌 요점이 될 수 있는지 잘 모르겠습니다. :-)
Dan Atkinson

잘 하셨어요! 수천 개의 서브 디렉토리가있을 때 속도가 느릴 수 있으므로 모든 디렉토리 스캔을 생략합니다. 통계를 위해 너무 높은 가격 :-). 또한 변수 정의 에 $_ -notmatch 'node_modules'조건을 추가하겠습니다$FoldersToRemove
Tomino

16

아무것도 나를 위해 일하지 않았다. 디버그 및 릴리스를 위해 bin 및 obj 폴더의 모든 파일을 삭제해야했습니다. 내 해결책 :

1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 언로드 한 다음 다시 마우스 오른쪽 버튼을 클릭하여 편집하고 하단으로 이동하십시오.

2. 삽입

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

3. 프로젝트를 저장하고 다시로드 한 후 마우스 오른쪽 버튼으로 클릭하고 정리합니다.


13

그런 목표는 깨끗한 대상 후에 꽤 우아한 방식으로해야합니다.

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

7

빌드하기 전에 bin 및 obj를 삭제하려면 프로젝트 파일에 추가하십시오.

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

다음은 기사입니다. 빌드 또는 배포 전에 bin 및 / 또는 obj 폴더를 제거하는 방법


1
그러나 재 구축에서만이 작업을 수행하려고합니다. 모든 빌드를 다시 빌드 하지 않으려는 경우 !
Josh M.

4

Steve의 PowerShell 스크립트와 매우 유사합니다. 대부분의 프로젝트에 필요할 때 TestResults 및 패키지를 추가했습니다.

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



3

매우 빠르고 쉬운 방법은 rimrafnpm 유틸리티 를 사용하는 것입니다 .

> npm i rimraf -g

그런 다음 프로젝트 루트의 명령은 매우 간단합니다 (스크립트 파일에 저장할 수 있음).

projectRoot> rimraf **/bin **/obj

원하는 효과를 최적화하기 위해 BeforeRebuild문서에 지정된 프로젝트 이벤트 대상 (사용할 수있는 대상을 이전 명령으로 실행)을 활용할 수 있습니다. https://docs.microsoft.com/en-us/visualstudio/ msbuild / 방법 확장-시각-스튜디오-빌드-프로세스? view = vs-2017

나는 rimraf 유틸리티가 크로스 플랫폼이고 정말 빠르기 때문에 좋아합니다. 그러나 RemoveDir대상 이벤트 옵션을 사용하기로 결정한 경우 .csproj 에서 명령을 사용할 수도 있습니다 . 이 RemoveDir접근법은 @Shaman의 또 다른 답변에서 잘 설명되어 있습니다 : https : //.com/a/22306653/1534753


2

여기에 답이 있습니다 비슷한 질문에 대한 대답입니다. 간단하고 쉽습니다.

다른 사람들이 이미 응답 했으므로 Clean은 빌드에서 생성 된 모든 아티팩트를 제거합니다. 그러나 그것은 다른 모든 것 뒤에 남을 것입니다.

MSBuild 프로젝트에 일부 사용자 정의가 있으면 문제가 발생하여 삭제해야 할 것으로 남을 수 있습니다.

끝 부분 근처에 이것을 추가하여. * proj를 간단하게 변경 하여이 문제를 피할 수 있습니다.

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

현재 플랫폼 / 구성의 bin 폴더에있는 모든 것을 제거합니다.


2

이것은 모든 BIN 및 OBJ 폴더를 재귀 적으로 삭제하는 데 사용하는 배치 파일입니다.

  1. 빈 파일을 작성하고 이름을 DeleteBinObjFolders.bat로 지정하십시오 .
  2. 아래 코드를 DeleteBinObjFolders.bat에 복사하여 붙여 넣기
  3. 솔루션 (* .sln) 파일과 동일한 폴더에서 DeleteBinObjFolders.bat 파일을 이동 하십시오.
@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

'깨끗한'것만으로는 충분하지 않습니까? 명령 줄에서 / t : clean을 사용하여 msbuild를 호출 할 수 있습니다.


7
실제로 "깨끗한"것만으로는 충분하지 않습니다. MEF를 사용할 때 특히 그렇습니다. "Clean Solution"은 제거한 참조를 제거하지 않으므로 폴더의 DLL을 동적으로로드 할 때 문제가 발생할 수 있습니다.
Alex

5
"내 컴퓨터에서 작동"버그는 "깨끗한"작업을 수행하여 제거되지 않은 bin / obj 폴더에 오래되거나 예상치 못한 것들로 인해 발생합니다.
Luke

1

빌드 서버에서 nant 스크립트를 통해 bin 및 obj 디렉토리를 명시 적으로 삭제합니다.

각 프로젝트 빌드 스크립트는 출력 / 임시 디렉토리를 담당합니다. 그런 식으로 잘 작동합니다. 따라서 프로젝트를 변경하고 새 프로젝트를 추가하면 스크립트가 작동하는 스크립트를 기반으로하며 삭제 단계를 확인하고 처리합니다.

논리 개발 머신에서 수행하는 경우 다른 사람들이 언급했듯이 Visual Studio를 통해 정리해야합니다.


때로는 모든 빌드가 완전히 새로운 것인지 확인해야합니다. bin과 obj를 삭제하는 것이 더 신뢰할만한 것으로 입증되었습니다.
MichaelD

우리에게는 '빌드 머신'의 빌드 만 테스트되거나 프로덕션 환경에서 사용되므로 개발자는 '모두 클린'유형의 문제가 아니어야하며 빌드 서버가 그렇게합니다. 또한 완전한 빌드를 위해 개발자가 필요하지 않습니다.
Simeon Pilgrim

1
nant로 가장 쉬운 방법은 무엇입니까? 나는 수십 개의 프로젝트로 구성된 계층 구조를 가지고 있으며 삭제 스크립트를 잘못 사용하지 않을 것입니다. =)
mpontillo

우리는 많은 실행 파일 / dll을 '자산'으로 만들었으므로 자산마다 빌드하는 nant 스크립트가 있습니다. 각각에 대해 삭제하려는 디버그 / 릴리스 bin / obj 디렉토리마다 줄을 배치하는 삭제 섹션이 있습니다.
Simeon Pilgrim

1

나는 실제로 소스 트리를 어지럽히는 obj 파일을 싫어합니다. 나는 보통 소스 트리 외부에서 obj 파일을 출력하도록 프로젝트를 설정합니다. C # 프로젝트의 경우 일반적으로 사용합니다

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

C ++ 프로젝트

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


1

실제로 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 매개 변수를 포함 시켰으므로 처음 실행 한 목록에 만족하면 제거하십시오.


1

Robert H 를 약간 수정하여 오류를 건너 뛰고 삭제 파일을 인쇄합니다. 또한 .vs, _resharperpackage폴더를 usally로 지 웁니다 .

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

git무시할 파일과 디렉토리를 포함하여 모든 변경 사항을 지우는 명령도 주목해야합니다 .

git clean -dfx

0

프로젝트 파일이 많은 큰 .SLN 파일이 있습니다. 모든 비 소스 제어 파일이있는 "ViewLocal"디렉토리를 갖는 정책을 시작했습니다. 그 디렉토리 안에는 'Inter'와 'Out'디렉토리가 있습니다. 중간 파일 및 출력 파일 각각에 대해.

이것은 분명히 'viewlocal'디렉토리로 이동하고 간단한 삭제를 수행하여 모든 것을 제거하기 쉽습니다.

스크립트를 사용하여이 문제를 해결하는 방법을 알아 내기 전에 시간을 투자하기 전에 비슷한 것을 설정하는 것이 좋습니다.

그래도 거짓말을하지는 않겠지 만, 대규모 조직에서 그러한 설정을 유지하는 것은 흥미 롭습니다. 특히 파일을 처리하고 비 소스 제어 소스 파일을 생성하는 QT와 같은 기술을 사용하는 경우. 그러나 그것은 전체 다른 이야기입니다!


0

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 }

0

배치 솔루션. 다음 명령을 사용하고 있습니다.

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. 예상하지 못한 결과가 포함됩니다 (tobj 폴더) 여기에 이미지 설명을 입력하십시오
DIR /S /AD /B *obj여기에 이미지 설명을 입력하십시오


@IF EXIST %%G IF %%~aG geq d기존 경로를 확인하는 데 사용되며 경로는 파일이 아닌 폴더입니다.
xianyi 2018 년

0

이것은 잘 작동합니다 : / d / r 시작하십시오. (bin, obj, ClientBin, Generated_Code)의 %% d가 @if "%% d"rd / s / q "%% d"인 경우 @


0

이 쉼표와 함께 .bat 파일을 사용합니다.

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

솔루션 / 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "청소"버튼을 클릭 할 수 있다고 생각합니다.

내가 기억하는 한 그렇게 작동했습니다. VS.NET이 없어서 테스트 할 수 없습니다.


맞습니다. 제안 된 모든 솔루션 중에서 가장 간단하고 가장 쉬운 방법입니다 (특정 상황에 적합하다고 가정 할 때 ...)
Chris Halcrow

8
미안하지만 이것은 사실이 아닙니다. 문제의 근본 인 / obj의 내용은 삭제하지 않습니다. 적어도이 2013 년 갱신 3 VS와 상황
Ognyan 디미트로프

VS2013 업데이트 4에서도 동일한 문제가 발생했습니다. (참고 : VS2010은
제대로 작동했습니다

더 나은 설명을 위해이 답변 (이 질문과 동일)을보십시오 : stackoverflow.com/a/18317221/374198
Josh M.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.