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

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


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


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

据我所知,它是这样工作的。我现在没有VS.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的回答所示——如果你选择给任何东西投赞成票,请确保你把功劳归功于他,而不是我:)

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


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

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

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


我讨厌obj文件乱扔源代码树。我通常设置项目,以便它们在源树外输出obj文件。对于我通常使用的c#项目

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

用于c++项目

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

我们有一个大的。sln文件与许多项目文件。我开始了一个“ViewLocal”目录的策略,所有非源代码控制的文件都位于这个目录中。该目录中有一个“Inter”和一个“Out”目录。分别用于中间文件和输出文件。

这显然让你很容易去到你的“viewlocal”目录,做一个简单的删除,以摆脱一切。

在花时间研究如何使用脚本解决这个问题之前,您可能会考虑设置一些类似的东西。

我不会说谎,在一个大型组织中维持这样的设置已经证明....有趣。特别是当您使用像QT这样的技术来处理文件和创建非源代码控制的源文件时。但那完全是另一回事了!


http://vsclean.codeplex.com/

查找Visual的命令行工具 工作室解决方案和运行清洁 指挥他们。这可以让你清洁 打开所有这些的/bin/*目录 你手头的旧项目 你的硬盘


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

<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

我找到了这条线,然后赢了。再搜索一下就找到了这个power shell脚本:

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

或者更简洁:

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

考虑到我在这里找不到答案,我想我应该分享一下。


这招对我很管用:

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

根据superuser.com上的答案


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

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


实际上,你可以进一步使用PS的建议,在项目目录中创建一个vbs文件,就像这样:

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

为了安全起见,我包含了-WhatIf参数,所以如果在第一次运行时对列表感到满意,可以删除它。


看看CleanProject,它会删除bin文件夹,obj文件夹,TestResults文件夹和Resharper文件夹。源代码也可以获得。


从使用Windows PowerShell删除obj, bin和ReSharper文件夹

与Robert H的答案非常相似,只是语法更短

powershell运行 Cd(更改目录)到项目文件夹的根目录 粘贴并运行下面的脚本 Dir .\ -include bin,obj,resharper* -递归| foreach($) {rd $_。fullname -Recurse -Force}


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

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

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

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

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

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


在添加到项目文件之前删除bin和obj:

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

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


注意:这是一个老答案,可能需要在VS 2019和一些obj工件的新版本中进行调整。在使用这种方法之前,请确保VS不需要在目标和输出目录中成功构建任何东西。

像这样的东西应该以一种非常优雅的方式完成,在干净的目标之后:

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

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

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

2.插入

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

3.保存,重新加载项目,右键单击清洁和立即。


考虑到PS1文件在currentFolder(你需要删除bin和obj文件夹的文件夹)中

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

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

与Steve的PowerShell脚本非常相似。我只是向它添加了TestResults和包,因为大多数项目都需要它。

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

这是我用于递归删除所有BIN和OBJ文件夹的批处理文件。

创建一个空文件,命名为DeleteBinObjFolders.bat 复制粘贴下面的代码到DeleteBinObjFolders.bat 将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

用于批量解决方案。我正在使用以下命令:

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


不使用DIR /S /AD /B xxx的原因 1. DIR /S /AD /B obj将返回空列表(至少在我的Windows10上) 2. DIR /S /AD /B *obj将包含非预期的结果(tobj文件夹)


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

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

> npm i rimraf -g

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

projectRoot> rimraf **/bin **/obj

为了优化想要的效果,你可以利用文档中指定的项目事件目标(你可以使用的是BeforeRebuild,并让它运行前面的命令):https://learn.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2017

我喜欢rimraf实用程序,因为它是十字板,真的很快。但是,如果您决定使用目标事件选项,也可以在.csproj中使用RemoveDir命令。RemoveDir方法在@Shaman的另一个回答中有很好的解释:https://stackoverflow.com/a/22306653/1534753


这对我来说很好: 开始/d /r。%%d in (bin,obj, ClientBin,Generated_Code) do @if exist "%%d" rd /s /q "%%d"


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

在VS 2019/VS 2022中,这是唯一明智的解决方案。

在解决方案文件夹(.sln文件所在的位置)中,创建一个名为Directory.Build.props的文件,并按如下所示添加编辑它。在这里阅读这个特殊的文件。

Directory.Build.props

<Project>
  <Target Name="RemoveObjAndBinFolders" AfterTargets="Clean">
    <PropertyGroup>
      <ObjFolder>$(ProjectDir)$(BaseIntermediateOutputPath)</ObjFolder>
      <BinFolder>$(ProjectDir)$(BaseOutputPath)</BinFolder>

      <!-- Microsoft.NET.Sdk.Web sets $(BaseIntermediateOutputPath) to -->
      <!-- an absolute path. Not fixed up to MsBuild 17! -->
      <BaseIntermediateOutputPathFix Condition="$(BaseIntermediateOutputPath.StartsWith($(MSBuildProjectDirectory)))">$([MSBuild]::MakeRelative(
        $(ProjectDir),
        $(BaseIntermediateOutputPath)
      ))</BaseIntermediateOutputPathFix>
    
      <ObjFolder Condition="$(BaseIntermediateOutputPath.StartsWith($(MSBuildProjectDirectory)))">$(ProjectDir)$(BaseIntermediateOutputPathFix)</ObjFolder>
    </PropertyGroup>

    <ItemGroup>
      <ObjFiles Include="$(ObjFolder)/*.*"
                Exclude="$(ObjFolder)/project.assets.json" />
      <ObjSubFolders
                Include="$([System.IO.Directory]::GetDirectories('$(ObjFolder)'))" />
    </ItemGroup>
    
    <!-- Remove "obj" sub folders -->
    <RemoveDir Directories="@(ObjSubFolders)" ContinueOnError="true" />
    <!-- Remove "obj" files (keeping necessary asset file)-->
    <Delete Files="@(ObjFiles)" />
    
    <!-- Remove "bin" folders -->
    <RemoveDir Directories="$(BinFolder)" ContinueOnError="true" />
  </Target>
</Project>

不需要修改一堆.csproj文件。另外,请注意,我并没有像一些人建议的那样删除$(TargetDir)。如果$(OutDir)被设置为某个自定义目录(一种常见的做法),那么这样做可能会使构建系统瘫痪。


上面的几个解决方案给出了如何排除文件夹的答案,但不是在cmd。扩展Steve Willcock的回答,排除例如node_modules文件夹,其中可能有bin文件夹,可以使用下面扩展的一行程序。

FOR /F "tokens=*" %G IN ('DIR /B /AD /S bin obj ^|find ^"node_modules^" /v /i') DO RMDIR /S /Q "%G"

正如其他人所指出的那样,在将上述命令放在cmd脚本中而不是直接在命令行中使用它的情况下,将%G替换为%%G。


我采取了不同的方法来解决这个问题。我没有编写一个脚本来寻找不同位置的所有“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文件夹就可以了。