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

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


当前回答

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

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

其他回答

我认为你可以右键点击你的解决方案/项目,然后点击“清洁”按钮。

据我所知,它是这样工作的。我现在没有VS.NET,所以不能测试它。

为了达到这个目标,我总是在我的解决方案中添加一个新的目标。

<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

“干净”还不够好吗?注意,您可以使用/t:clean从命令行调用msbuild。

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

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

下面是我给类似问题的答案,简单,容易,工作得很好,不需要任何其他东西,除了你已经有Visual Studio。

正如其他人已经回应的那样,Clean将删除所有由构建生成的工件。但它会把一切都抛在脑后。

如果你在你的MSBuild项目中有一些自定义,这可能会带来麻烦,并留下一些你认为应该删除的东西。

你可以通过简单地修改你的。*proj来避免这个问题:

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

这将删除当前平台/配置的bin文件夹中的所有内容。