すべてのプロジェクトを強制的にすべて再構築するために、すべてのbinおよびobjフォルダーを削除したい


263

私は複数のプロジェクトで作業していて、「bin」または「obj」という名前のすべてのフォルダーを再帰的に削除したいので、すべてのプロジェクトですべてが再構築されます(Visual Studioに以前のすべてのことを忘れさせる唯一の方法である場合もあります)ビルド)。

.NETプログラムを作成する必要なく、これを(たとえば、.batファイルを使用して)すばやく行う方法はありますか?


25
Build-> Clean Solutionが実際にこれを行うといいでしょう。
ダスティンアンドリュース

回答:


412

これは、使用するシェルによって異なります。

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で1行に減らすことができます。

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 }

以下のロバートHの回答に見られるように、何かに賛成票を投じる場合は、私ではなく、Powershellの回答をクレジットに記入してください。

もちろん、最初に安全な場所で選択したコマンドを実行してテストするのが賢明です。


5
あなたの答えのためのTHX。エラーが表示されます:現在、%% Gは予期されていませんでした。
MichaelD 2009

うーん奇妙です-私のマシンでは正常に動作します(vista 64ビットビジネス)-XPマシンでも試してみます。
スティーブウィルコック

48
「現時点では%% Gは予期されていませんでした」-これは、バッチファイル内からではなくコマンドラインから実行した場合に発生します。この場合は単一の '%'を使用します。
Designpattern 2012年

4
+1コードを説明していただけませんか?お願いします。
fibreOptics 2014

2
@SteveWillcockそれはきれいよりも良いです。Cleanは、プロジェクトで参照されていないdll(残り物)を削除しません。
Piotr Szmyd 2014年

256

私はこのスレッドを見つけてビンゴを手に入れました。もう少し検索すると、このPower Shellスクリプトが見つかりました。

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

ここを見ていて答えが見つからなかったので、共有したいと思いました。


@ナイジェル、このソリューションは非常にパフォーマンスが悪いのではないですか?10倍の速度で実行できるカスタムCスクリプトを作成してみませんか?
Pacerier、2015年

37
あなたはforeachを必要としません-あなたは単にgciをremove-item(すなわちgci -include bin,obj -recurse | remove-item -force -recurse)に直接パイプすることができるはずです
Chris 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(ここでは1行として少し厄介です:))
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に使用します。%bind(bin、obj、App_Data、packages)do @if exist "%% d" rd / s / q "%% d"
RickAndMSFT 2013

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 =「クリーン」を追加することができ、自動的に再構築やったときに、直接または間接的に呼び出されるクリーン後に呼び出されます
Newtopian

29

私が書いたPowerShellスクリプトを実行するに。

利点は、削除されたフォルダの概要が出力され、無視するサブフォルダ階層を指定した場合は無視されることです。

出力例


1
+1とてもいいです!Window 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.プロジェクトを保存してリロードし、clean and prestoを右クリックします。


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 / how-to-extend-the-visual-studio-build-process?view = vs-2017

クロスプラットフォームで非常に高速なリムラフユーティリティが気に入っています。ただし、RemoveDirターゲットイベントオプションを使用する場合は、.csproj のコマンドを使用することもできます。このRemoveDirアプローチは、ここ@Shamanの別の回答でよく説明されています:https ://stackoverflow.com/a/22306653/1534753


2

これは、私が同様の質問に答えたものです。シンプル、簡単、かなり機能し、Visual Studioですでに持っているもの以外は何も必要としません。

他の人がすでに応答しているので、Cleanはビルドによって生成されたすべてのアーティファクトを削除します。しかし、それは他のすべてを残します。

MSBuildプロジェクトにいくつかのカスタマイズがある場合、これは問題を引き起こし、削除する必要があると思われるものを残す可能性があります。

これを末尾近くに追加することで、。* projに簡単な変更を加えるだけでこの問題を回避できます。

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

これにより、現在のプラットフォーム/構成のbinフォルダー内のすべてが削除されます。


2

これは、すべてのBINおよびOBJフォルダーを再帰的に削除するために使用する私のバッチファイルです。

  1. 空のファイルを作成し、DeleteBinObjFolders.batという名前を付けます。
  2. 以下のコードをDeleteBinObjFolders.batにコピーして貼り付けます
  3. DeleteBinObjFolders.batファイルをソリューション(* .sln)ファイルと同じフォルダーに移動します。
@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を使用する場合に特に当てはまります。「クリーンソリューション」は、削除した参照を削除しないため、フォルダーのDLLを動的にロードするときに問題が発生する可能性があります。
アレックス

5
「マシン上で動作する」バグの多くは、「クリーン」を実行しても削除されないbin / objフォルダーに古いまたは予期しないものが置かれていることが原因です。
ルーク、

1

ビルドサーバーでは、nantスクリプトを使用して、binおよびobjディレクトリを明示的に削除します。

各プロジェクトビルドスクリプトは、そのoutput / tempディレクトリを担当します。そのようにうまく動作します。したがって、プロジェクトを変更して新しいプロジェクトを追加するときは、スクリプトを作業スクリプトに基づいて作成します。削除の段階に気づき、それを処理します。

ロジック開発マシンでそれを行う場合は、他の人が述べたように、Visual Studioを介してクリーンに固執します。


すべてのビルドが完全に新しいことを確認する必要がある場合もあります。私はそれを行うためのクリーンなソリューションを信頼することはできません。binとobjを削除することは、多くの場合、より信頼できることが証明されました
MichaelD

私たちにとっては、「ビルドマシン」からのビルドのみがテストまたは本番環境で使用されるため、開発者が「すべてクリーン」タイプの問題を抱えている必要はなく、ビルドサーバーがそれを行います。また、完全なビルドを作成するのに1人の開発者が必要ないことも意味します。
Simeon Pilgrim

1
これをナントで行う最も簡単な方法は何ですか?私は数十のプロジェクトの階層を持っているので、削除スクリプトを誤解しないでください。=)
mpontillo 2010年

多くの実行可能ファイル/ dll「アセット」がビルドされているため、アセットごとにそれをビルドするnantスクリプトがあります。それぞれに、削除したいdebug / release bin / objディレクトリごとに行を配置するDeleteセクションがあります。
Simeon Pilgrim

1

私は実際にはソースツリーをポイ捨てするobjファイルが嫌いです。私は通常、プロジェクトがソースツリーの外にobjファイルを出力するように設定します。C#プロジェクトの場合、私は通常使用します

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

C ++プロジェクトの場合

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

1

http://vsclean.codeplex.com/

Visual Studioソリューションを見つけ、それらに対してCleanコマンドを実行するコマンドラインツール。これにより、ハードドライブにある古いプロジェクトすべての/ bin / *ディレクトリをクリーンアップできます


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_resharperおよびpackageフォルダーをクリアします。

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

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の内容は削除されません。少なくとも、これは、VS 2013のアップデート3の状況である
Ognyanディミトロフ

VS2013 update 4で同じ問題が発生しました(注:VS2010は問題なく動作していました)
juFo

より正確な説明については、この回答(この非常に同じ質問について)を参照してください:stackoverflow.com/a/18317221/374198
Josh M.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.