448 Stimmen

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

Ich arbeite mit mehreren Projekten und möchte alle Ordner mit dem Namen 'bin' oder 'obj' rekursiv löschen, um sicherzustellen, dass alle Projekte alles neu erstellen (manchmal ist dies der einzige Weg, um Visual Studio dazu zu zwingen, alle vorherigen Builds zu vergessen).

Gibt es einen schnellen Weg, dies zu erreichen (mit einer .bat-Datei zum Beispiel), ohne ein .NET-Programm schreiben zu müssen?

80 Stimmen

Es wäre schön, wenn Build->Clean Solution dies tatsächlich tun würde.

2 Stimmen

Es gibt ein Plugin, das ich gefunden habe namens CleanBinAndObj, das alle bin und obj Ordner löscht. Sehr effektiv für einzelne Lösungen mit vielen Projekten.

702voto

Steve Willcock Punkte 24787

Dies hängt davon ab, welche Shell Sie bevorzugen zu verwenden.

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 bash- oder zsh-Shell verwenden (wie z.B. git bash oder babun unter Windows oder die meisten Linux/OS X-Shells), dann ist dies ein viel angenehmerer, prägnanterer Weg, um zu erreichen, was Sie wollen:

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

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

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

Beachten Sie, dass wenn Ihre Verzeichnisse oder Dateinamen Leerzeichen oder Anführungszeichen enthalten, find diese Einträge so senden wird, wie sie sind, was xargs in mehrere Einträge aufteilen kann. Wenn Ihre Shell sie unterstützt, werden -print0 und -0 diese Schwäche umgehen, so dass die oben genannten Beispiele wie folgt lauten:

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 dies verwenden:

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

wie in Robert H's Antwort unten gesehen - stellen Sie sicher, dass Sie ihm für die Powershell-Antwort Anerkennung geben, anstatt mir, wenn Sie sich dafür entscheiden, etwas zu up-voten :)

Es wäre natürlich ratsam, zuerst irgendwo sicher das gewählte Kommando auszuführen, um es zu testen!

6 Stimmen

Vielen Dank für Ihre Antwort. Ich erhalte einen Fehler: %%G wurde zu diesem Zeitpunkt unerwartet.

0 Stimmen

Hmm, das ist merkwürdig - es funktioniert einwandfrei auf meinem Computer (Vista 64-Bit Business) - Ich werde es auch auf einem XP-Computer versuchen.

0 Stimmen

Alles klar, ich habe es zum Laufen gebracht. Ein seltsames Problem ist, dass er nichts löscht, wenn sich ein Bin-Ordner im Root befindet. Aber das spielt keine Rolle.

490voto

Robert H. Punkte 4814

Ich habe diesen Thread gefunden und Bingo bekommen. Bei etwas intensiverer Suche stieß ich auf dieses PowerShell-Skript:

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

Oder knapper:

gci -include bin,obj -recurse | remove-item -force -recurse

Ich dachte, ich würde teilen, da ich die Antwort nicht gefunden habe, als ich hier gesucht habe.

0 Stimmen

@Nigel, Ist diese Lösung nicht extrem unperformant? Warum schreiben Sie nicht ein benutzerdefiniertes C-Skript, das mit 10-facher Geschwindigkeit ausgeführt werden kann?

8 Stimmen

Ich musste auch Ordner aus dem Suchpfad ausschließen, und ich mag die -WhatIf Flagge zum Testen zuerst, also landete ich damit: $foldersToRemove='bin','obj';[string[]]$foldersToIgnore='Thi‌​rdParty';Get-ChildIt‌​em .\ -Include $foldersToRemove -Recurse|Where-Object{$_.FullName -inotmatch "\\$($foldersToIgnore -join '|')\\"}|Remove-Item -Force -Recurse -WhatIf (ein bisschen unordentlich hier, da eine Zeile :))

0 Stimmen

@ChrisJ Erwägen Sie, eine neue Antwort mit Ihrer Lösung hinzuzufügen.

89voto

Daniel Rehner Punkte 1721

Dies hat bei mir funktioniert:

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

Basierend auf dieser Antwort auf superuser.com

2 Stimmen

Großartig und einfach zu erweitern. Ich benutze für /d /r. %%d in (bin, obj, App_Data, packages) do @if exist "%%d" rd /s/q "%%d"

6 Stimmen

@ParoX du musst es innerhalb einer .bat-Datei ausführen

43voto

doblak Punkte 2886

Ich habe ein Powershell-Skript dafür geschrieben.

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

Beispiel für die Ausgabe

1 Stimmen

+1 sehr nett! Habe gerade herausgefunden, dass wir tatsächlich debuggen und die Variablen wie ein Voll-Debug-Tool im Windows Power Shell anzeigen können!

0 Stimmen

Ich mag diese Lösung. Ich muss mich nicht mit Visual Studio herumschlagen und kann es ausführen, wann ich will. Sehr schön!

0 Stimmen

Passt perfekt zu meinen Bedürfnissen, aber ich bin mir nicht sicher, warum dies nicht einfach ein Gist sein könnte, anstatt ein komplettes Repository zu sein. :-)

36voto

Ich pflege immer ein neues Ziel in meinen Lösungen hinzuzufügen, um dies zu erreichen.

Und Sie können es von der Befehlszeile aus aufrufen

msbuild /t:clean_folders

Dies kann Ihre Batch-Datei sein.

msbuild /t:clean_folders
PAUSE

0 Stimmen

Das funktioniert nicht für eine sln-Datei, da Sie keine benutzerdefinierten Ziele darauf aufrufen können. Kennen Sie eine Lösung dafür?

4 Stimmen

@PiotrOwsiak ja, du musst die Datei "before.MySlnFileName.sln.targets" im selben Verzeichnis erstellen, in dem du deine .sln-Datei hast, und dort deine Zieldefinitionen platzieren.

3 Stimmen

Sie können AfterTargets = "Clean" als Attribut zum Target hinzufügen, es wird automatisch nach dem Clean aufgerufen, das direkt oder indirekt aufgerufen wird, wenn ein Neuaufbau durchgeführt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X