我与多个项目一起工作,我想递归删除所有名为“bin”或“obj”的文件夹,这样我就可以确保所有项目都会重新构建所有内容(有时这是迫使Visual Studio忘记所有以前的构建的唯一方法)。

是否有一种快速的方法来实现这一点(例如使用.bat文件),而不必编写。net程序?


当前回答

我使用.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"

其他回答

我使用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

我采取了不同的方法来解决这个问题。我没有编写一个脚本来寻找不同位置的所有“obj”和“bin”文件夹,而是直接在构建过程中将这些文件夹分组在一个方便的位置。

在解决方案文件夹中添加一个Directory.Build.props文件,如下所示:

<Project>
    <PropertyGroup>
        <BaseProjectArtifactPath>$(MSBuildThisFileDirectory).artifacts\$(MSBuildProjectName)</BaseProjectArtifactPath>
        <BaseOutputPath>$(BaseProjectArtifactPath)\bin\</BaseOutputPath>
        <BaseIntermediateOutputPath>$(BaseProjectArtifactPath)\obj\</BaseIntermediateOutputPath>
    </PropertyGroup>
</Project>

现在,所有的“bin”和“obj”文件夹将被创建在解决方案根目录下的一个单独的.artifacts文件夹中,而不是各个项目文件夹中。准备好重新开始了吗?只要删除.artifacts文件夹就可以了。

在我们的构建服务器上,我们通过nant脚本显式删除bin和obj目录。

每个项目构建脚本都负责它的输出/临时目录。这样做效果很好。因此,当我们更改一个项目并添加一个新项目时,我们将脚本建立在一个工作脚本的基础上,您会注意到删除阶段并照顾它。

如果你是在你的逻辑开发机上做的,我还是会像其他人提到的那样,坚持通过Visual Studio进行清理。

我写了一个powershell脚本来做这件事。

这样做的好处是,它会打印已删除文件夹的摘要,如果指定要忽略任何子文件夹层次结构,则会忽略那些文件夹。

这取决于您更喜欢使用的shell。

如果你在Windows上使用cmd shell,那么以下命令应该可以工作:

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类型的shell(例如Windows或大多数Linux / OS X shell上的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可能将其拆分为多个条目。如果你的shell支持它们,-print0和-0将解决这个缺点,所以上面的例子变成:

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

and:

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的回答所示——如果你选择给任何东西投赞成票,请确保你把功劳归功于他,而不是我:)

当然,明智的做法是先在安全的地方运行您选择的任何命令来测试它!