it-swarm.com.de

Ich möchte alle Ordner bin und obj löschen, um alle Projekte zu zwingen, alles neu zu erstellen

Ich arbeite mit mehreren Projekten, und ich möchte alle Ordner mit dem Namen "bin" oder "obj" rekursiv löschen. Ich bin sicher, dass alle Projekte alles neu erstellen werden (manchmal ist es die einzige Möglichkeit, Visual Studio dazu zu zwingen, alles Vorhergehende zu vergessen baut). 

Gibt es eine schnelle Möglichkeit, dies zu tun (z. B. mit einer .bat-Datei), ohne ein .NET-Programm schreiben zu müssen?

200
MichaelD

Dies hängt von der von Ihnen bevorzugten Shell ab.

Wenn Sie die Cmd-Shell unter Windows verwenden, sollte Folgendes funktionieren:

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"

Wenn Sie eine Shell vom Typ bash oder zsh verwenden (z. B. git bash oder babun unter Windows oder die meisten Linux/OS X-Shells), ist dies eine viel schönere und prägnantere Methode, um das zu tun, was Sie möchten:

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

und diese kann mit einem ODER auf eine Zeile reduziert werden:

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

Beachten Sie: Wenn Ihre Verzeichnisse mit Dateinamen Leerzeichen oder Anführungszeichen enthalten, werden diese Einträge unverändert von find gesendet, wobei die Xargs in mehrere Einträge aufgeteilt werden können. Unter macOS besteht die Problemumgehung darin, -print0 und -0 zu verwenden. Die obigen Beispiele werden also:

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

und:

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

Wenn Sie Powershell verwenden, können Sie Folgendes verwenden:

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

wie in Robert Hs Antwort unten zu sehen ist - stellen Sie sicher, dass Sie ihm die Powerhell-Antwort und nicht mich zuschreiben, wenn Sie sich für eine Abstimmung entscheiden. :)

Es wäre natürlich ratsam, den Befehl, den Sie wählen, zuerst an einem sicheren Ort auszuführen, um ihn zu testen!

313
Steve Willcock

Ich fand diesen Thread und bekam Bingo. Ein wenig mehr Suche ergab dieses Power-Shell-Skript:

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

Ich dachte, ich würde es teilen, wenn man bedenkt, dass ich die Antwort nicht fand, als ich hier sah.

194
Robert H.

Das hat für mich funktioniert:

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

Basierend auf dieser Antwort auf superuser.com

63
Daniel Rehner

Um dies zu erreichen, füge ich meinen Lösungen immer ein neues Ziel hinzu.

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

Und Sie können es von der Kommandozeile aus aufrufen

msbuild /t:clean_folders

Dies kann Ihre Batchdatei sein.

msbuild /t:clean_folders
PAUSE

Ich habe ein Powershell-Skript geschrieben , um es zu tun. 

Der Vorteil ist, dass eine Zusammenfassung der gelöschten Ordner gedruckt wird, und ignoriert werden, wenn Sie eine Unterordnerhierarchie angegeben haben, die ignoriert werden soll.

Output example

22
doblak

Nichts hat für mich funktioniert. Ich musste alle Dateien in den Ordnern bin und obj für das Debuggen und Freigeben löschen. Meine Lösung:

1.Klicken Sie mit der rechten Maustaste auf das Projekt, entfernen Sie es, klicken Sie erneut mit der rechten Maustaste, und klicken Sie auf Bearbeiten

2. einfügen

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

3. Speichern Sie das Projekt, laden Sie es erneut, und klicken Sie mit der rechten Maustaste auf "Reinigen".

16
Kdefthog

So etwas sollte es nach einem sauberen Ziel auf ziemlich elegante Weise tun:

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

Um bin und obj vor dem Build zu löschen, fügen Sie die Projektdatei hinzu:

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

Hier ist ein Artikel: Wie entferne ich bin und/oder obj Ordner vor dem Build oder Deploy ?

7
Shaman

Schauen Sie sich das CleanProject an, es werden Bin-Ordner, Obj-Ordner, TestResults-Ordner und Resharper-Ordner gelöscht. Der Quellcode ist ebenfalls verfügbar.

3
habakuk

Sehr ähnlich zu Steve's PowerShell-Skripten. Ich habe gerade TestResults und Pakete hinzugefügt, da es für die meisten Projekte benötigt wird.

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

Hier ist die Antwort Ich habe eine ähnliche Frage gestellt: Einfach, leicht, funktioniert ziemlich gut und erfordert nichts anderes als das, was Sie bereits mit Visual Studio haben.

Da andere bereits geantwortet haben, entfernt Clean alle Artefakte, die vom Build generiert werden. Aber es wird alles andere zurücklassen.

Wenn Sie in Ihrem MSBuild-Projekt einige Anpassungen vorgenommen haben, kann dies zu Problemen führen und Dinge zurücklassen, von denen Sie denken, dass sie gelöscht werden sollten.

Sie können dieses Problem mit einer einfachen Änderung Ihres. * -Projos umgehen, indem Sie es irgendwo am Ende hinzufügen:

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

Dadurch wird alles in Ihrem bin-Ordner der aktuellen Plattform/Konfiguration entfernt.

2
Newtopian

Ist "sauber" nicht gut genug? Beachten Sie, dass Sie msbuild mit/t: clean von der Befehlszeile aus aufrufen können.

2
Brian

von Entfernen von obj-, bin- und ReSharper-Ordnern mit Windows PowerShell

sehr ähnlich zu Robert H Antwort mit kürzerer Syntax 

  1. powershell laufen lassen
  2. cd (Verzeichnis wechseln) zum Stammverzeichnis Ihres Projektordners
  3. einfügen und unter dem Skript ausführen

    dir.\-include bin, obj, resharper * -recurse | foreach ($) {rd $ _. fullname –Recurse –Force}

2
Iman Abidi

Auf unserem Build-Server löschen wir explizit die Verzeichnisse bin und obj über Nant-Skripte. 

Jedes Projekterstellungsskript ist für seine Ausgabe-/Zeitverzeichnisse verantwortlich. Funktioniert gut so. Wenn wir also ein Projekt ändern und ein neues hinzufügen, stützen wir das Skript auf einem funktionierenden Skript, und Sie bemerken die Löschphase und kümmern uns darum.

Wenn Sie dies auf Ihrem Logikentwicklungscomputer tun, würde ich, wie andere bereits erwähnt haben, über Visual Studio reinigen.

1
Simeon Pilgrim

Ich benutze eine kleine Modifikation von Robert H , die Fehler überspringt und die Löschdateien druckt. Normalerweise lösche ich auch die Ordner .vs, _resharper und package:

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

Bemerkenswert ist auch der Befehl git, mit dem alle Änderungen einschließlich der ignorierten Dateien und Verzeichnisse gelöscht werden:

git clean -dfx
1
eugstman

Sie können den PS-Vorschlag tatsächlich etwas weiter ausführen und eine VBS-Datei im Projektverzeichnis wie folgt erstellen:

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

Zur Sicherheit habe ich den Parameter -WhatIf hinzugefügt. Wenn Sie mit der Liste beim ersten Durchlauf zufrieden sind, entfernen Sie ihn.

1
KL XL

http://vsclean.codeplex.com/

Befehlszeilentool, das Visual .__ findet. Studio-Lösungen und führt die Clean befehle ihnen. So können Sie .__ reinigen. die/bin/* -Verzeichnisse all dieser alte Projekte, auf denen Sie herumliegen deine Festplatte

1
Joel Martinez

Dies ist meine Batch-Datei, die ich zum rekursiven Löschen aller BIN- und OBJ-Ordner verwende. 

  1. Erstellen Sie eine leere Datei und benennen Sie sie DeleteBinObjFolders.bat
  2. Kopieren Sie den folgenden Code in die DeleteBinObjFolders.bat .
  3. Verschieben Sie die Datei DeleteBinObjFolders.bat in den gleichen Ordner wie Ihre Lösungsdatei (* .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
Alper Ebicoglu

Für die Lösung im Batch. Ich benutze den folgenden Befehl:

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


Der Grund nicht mit DIR /S /AD /B xxx
1. DIR /S /AD /B obj gibt eine leere Liste zurück (zumindest auf meinem Windows10) enter image description here
2. DIR /S /AD /B *obj enthält das nicht erwartete Ergebnis (tobj Ordner) enter image description here

0
xianyi

Ich hasse eigentlich obj-Dateien, die die Quellbäume verstreuen. Normalerweise stelle ich Projekte so ein, dass sie OBJ-Dateien außerhalb des Quellbaums ausgeben. Für C # -Projekte verwende ich normalerweise

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

Für C++ - Projekte 

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

Wir haben eine große .SLN-Datei mit vielen Projektdateien. Ich habe die Richtlinie für ein "ViewLocal" -Verzeichnis gestartet, in dem sich alle nicht über Quelldateien kontrollierten Dateien befinden. In diesem Verzeichnis befindet sich ein 'Inter'- und ein' Out'-Verzeichnis. Für die Zwischendateien bzw. die Ausgabedateien.

Dies macht es natürlich einfach, einfach in Ihr 'viewlocal' -Verzeichnis zu gehen und einfach zu löschen, um alles zu löschen.

Bevor Sie sich die Zeit genommen haben, um herauszufinden, wie Sie dies mit Skripts umgehen können, sollten Sie sich überlegen, etwas Ähnliches einzurichten.

Ich werde nicht lügen, ein solches Setup in einer großen Organisation zu behalten hat sich als interessant erwiesen. Vor allem, wenn Sie Technologien wie QT verwenden, die Dateien verarbeiten und nicht über Quelldateien kontrollierte Quelldateien erstellen möchten. Aber das ist eine ganze andere Geschichte!

0
pj4533

Dies funktioniert gut für mich: Start für/d/r. %% d in (bin, obj, ClientBin, Generated_Code) @wenn vorhanden "%% d" rd/s/q "%% d"

0
Mudit Sharma

Beachten Sie, dass die PS1-Datei im aktuellen Ordner (dem Ordner, in dem Sie die Ordner bin und obj löschen müssen) vorhanden ist.

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

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

Eine sehr schnelle und schmerzlose Methode ist die Verwendung des rimraf npm-Dienstprogramms. Installieren Sie es zuerst global:

> npm i rimraf -g

Und dann ist der Befehl aus Ihrem Projektstamm recht einfach (der in einer Skriptdatei gespeichert werden kann):

projectRoot> rimraf **/bin **/obj

Um den gewünschten Effekt zu optimieren, können Sie die Projektereignisziele (die Sie verwenden könnten, BeforeRebuild verwenden und den vorherigen Befehl ausführen lassen) nutzen, die in den docs: https://docs.Microsoft.com/en-us angegeben sind/visualstudio/msbuild/erweiterung des visuellen studio-build-prozesses? view = vs-2017

Ich mag das rimraf-Dienstprogramm, da es crossplat und sehr schnell ist. Sie können jedoch auch den Befehl RemoveDir in .csproj verwenden, wenn Sie sich für die Zielereignisoption entscheiden. Der RemoveDir-Ansatz wurde in einer anderen Antwort hier von @Shaman gut erklärt: https://stackoverflow.com/a/22306653/1534753

0
Vedran Mandić