我想删除所有bin和obj文件夹以强制所有项目重建所有内容

Mic*_*elD 234 cmd batch-file visual-studio-2008 visual-studio

我使用多个项目,我希望递归删除名为'bin'或'obj'的所有文件夹,这样我确信所有项目都会重建所有内容(有时这是强制Visual Studio忘记以前的唯一方法)编译).

有没有快速的方法来完成这个(例如.bat文件)而不必编写.NET程序?

Ste*_*ock 365

这取决于您喜欢使用的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"
Run Code Online (Sandbox Code Playgroud)

如果你使用bash或zsh类型的shell(例如Windows上的git bash或babun或大多数Linux/OS X shell),那么这是一个更好,更简洁的方法来做你想要的:

find . -iname "bin" | xargs rm -rf
find . -iname "obj" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

这可以通过OR减少到一行:

find . -iname "bin" -o -iname "obj" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的文件名目录包含空格或引号,则find将按原样发送这些条目,xargs可以将其分成多个条目.在macOS上,解决方法是使用-print0和-0,以便上面的示例变为:

find . -iname "bin" -print0 | xargs -0 rm -rf
find . -iname "obj" -print0 | xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)

和:

find . -iname "bin" -o -iname "obj" -print0 | xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Powershell,那么您可以使用:

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

正如罗伯特H在下面的回答中所看到的那样 - 如果你选择投票,那么请确保你为powershell答案而不是我给予他赞誉:)

当然,最好先运行安全的任何命令来测试它!

  • "%% G此时出乎意料" - 当您从命令行而不是批处理文件中运行时会发生这种情况.在这种情况下使用单个'%'. (43认同)
  • 谢谢你的回答.我收到一个错误:%% G此时出乎意料. (5认同)
  • +1你介意为我解释代码吗?请. (4认同)
  • 如果有的话,我建议排除node_modules。许多包都有自己的 bin 文件夹(例如 Gulp),如果删除它们可能会导致程序崩溃。您可能必须运行“npm install”才能重新填充 bin 文件夹。 (3认同)
  • @SteveWillcock这比干净好.Clean不会删除项目中未引用的dll(剩菜). (2认同)

Rob*_* H. 225

我找到了这个帖子并得到了宾果游戏.再多搜索一下这个电源shell脚本:

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

考虑到我在这里看时没找到答案,我以为我会分享.

  • 你不需要foreach - 你应该只能将gci管道直接移入remove-item(即`gci -include bin,obj -recurse | remove-item -force -recurse`) (32认同)
  • 我还需要从搜索路径中排除文件夹,我喜欢先测试 `-WhatIf` 标志,所以我最终得到了这个:`$foldersToRemove='bin','obj';[string[]]$foldersToIgnore= 'ThirdParty';Get-ChildItem .\ -Include $foldersToRemove -Recurse|Where-Object{$_.FullName -inotmatch "\\$($foldersToIgnore -join '|')\\"}|Remove-Item -Force - Recurse -WhatIf`(虽然作为一行有点乱:)) (3认同)

Dan*_*ner 65

这对我有用:

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

基于superuser.com 上的这个答案

  • 将%%替换为%以从命令行运行 (9认同)
  • @ParoX你需要在.bat文件中运行它 (3认同)
  • 很棒,而且很容易扩展。我用于 /d /r 。%%d in (bin,obj,App_Data,packages) do @if 存在 "%%d" rd /s/q "%%d" (2认同)

Jho*_*re- 31

我总是在我的解决方案中添加一个新目标来实现这一目标.

<Target Name="clean_folders">
  <RemoveDir Directories=".\ProjectName\bin" />
  <RemoveDir Directories=".\ProjectName\obj" />
  <RemoveDir Directories="$(ProjectVarName)\bin" />
  <RemoveDir Directories="$(ProjectVarName)\obj" />
</Target>
Run Code Online (Sandbox Code Playgroud)

你可以从命令行调用它

msbuild /t:clean_folders
Run Code Online (Sandbox Code Playgroud)

这可以是您的批处理文件.

msbuild /t:clean_folders
PAUSE
Run Code Online (Sandbox Code Playgroud)

  • @PiotrOwsiak是的,您需要在您拥有.sln的同一目录中创建文件"before.MySlnFileName.sln.targets"并将目标定义放在那里 (3认同)
  • 你可以将AfterTargets ="Clean"作为属性添加到Target中,它将在Clean之后自动调用,在执行重建时直接或间接调用Clean (2认同)

dob*_*lak 25

我写了一个powershell脚本来做到这一点.

优点是它打印出已删除文件夹的摘要,如果指定了要忽略的子文件夹层次结构,则忽略这些文件夹.

输出示例

  • @Sahuagin它不是一个单行程,你只需要c/p来控制和执行.因此,我发现在github上链接到MIT许可脚本是一个更好的选择. (2认同)

Kde*_*hog 16

没有什么对我有用.我需要删除bin和obj文件夹中的所有文件以进行调试和发布.我的解决方案

1.右键单击项目,卸载,再次右键单击编辑,转到底部

2.插入

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

3.保存,重新加载项目,右键单击"清理"和"presto".


vez*_*kov 13

在清洁目标之后,像这样的东西应该以非常优雅的方式做到:

<Target Name="RemoveObjAndBin" AfterTargets="Clean">
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
    <RemoveDir Directories="$(TargetDir)" />
</Target>
Run Code Online (Sandbox Code Playgroud)


Sha*_*man 7

要在构建之前删除bin和obj,请添加到项目文件:

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

以下是文章:如何在构建或部署之前删除bin和/或obj文件夹


Abo*_*boo 6

非常类似于史蒂夫的 PowerShell 脚本。我刚刚添加了 TestResults 和包,因为大多数项目都需要它。

Get-ChildItem .\ -include bin,obj,packages,TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }
Run Code Online (Sandbox Code Playgroud)


Alp*_*glu 6

这是我的批处理文件,用于递归删除所有 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
Run Code Online (Sandbox Code Playgroud)


eug*_*man 6

我对Robert H进行了轻微修改,它可以跳过错误并打印删除文件。我通常还会清除.vs_resharperpackage文件夹:

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

另外值得注意的是git清除所有更改(包括忽略的文件和目录)的命令:

git clean -dfx
Run Code Online (Sandbox Code Playgroud)


Ved*_*dić 5

一个非常快速和轻松的方法是使用rimrafnpm 实用程序,首先全局安装它:

> npm i rimraf -g
Run Code Online (Sandbox Code Playgroud)

然后来自项目根目录的命令非常简单(可以保存到脚本文件中):

projectRoot> rimraf **/bin **/obj
Run Code Online (Sandbox Code Playgroud)

为了优化所需的效果,您可以利用BeforeRebuild文档中指定的项目事件目标(您可以使用的是并使其运行上一个命令):https : //docs.microsoft.com/en-us/visualstudio/ msbuild/how-to-to-extend-the-visual-studio-build-process?view=vs-2017

我喜欢 rimraf 实用程序,因为它是跨平台的,而且速度非常快。但是,RemoveDir如果您决定使用目标事件选项,您也可以使用.csproj 中的命令。RemoveDir@Shaman 在此处的另一个答案中很好地解释了该方法:https ://stackoverflow.com/a/22306653/1534753

  • 恕我直言,如果您使用的是类 Unix 操作系统,例如 Linux、macOS,那么您实际上不需要 rimraf。`rm -rf **/bin **/obj` 会做同样的事情。但是,值得提醒的一件事是,如果您的项目位于更深层次的子目录中,则两种解决方案都不会删除这些项目的 bin/obj 目录。所以这个方案适用于大多数场景,但不是所有场景。 (2认同)