我参与多个项目,想要递归删除所有名称为'bin'或'obj'的文件夹,这样我就可以确定所有项目将重新构建(有时这是强制Visual Studio忘记之前所有构建的唯一方法)。
有没有快速实现这一目标的方法(例如使用.bat文件)而无需编写.NET程序?
我参与多个项目,想要递归删除所有名称为'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上的git bash或babun,以及大多数Linux / OS X shell),那么这是一种更好、更简洁的方式来实现您想要的效果:find . -iname "bin" | xargs rm -rf
find . -iname "obj" | xargs rm -rf
而这可以通过使用“或”运算符来简化为一行代码:
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
并且:
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的回答所述 - 仅需确保在选择点赞时,归功于他提供的PowerShell答案而不是我 :)
当然,最好首先在安全环境中运行您选择的任何命令以进行测试!
node_modules
文件夹,我建议你从中排除它。很多包都有它们自己的 bin 文件夹(比如 Gulp),如果你删除了它们,可能会导致一些问题。你可能需要运行 npm install
来重新生成 bin 文件夹。 - JED我找到了这个帖子并获得了解决方案。继续搜索后,我找到了这个PowerShell脚本:
Get-ChildItem .\ -include bin,obj -Recurse | ForEach-Object ($_) { Remove-Item $_.FullName -Force -Recurse }
更简洁的方式:gci -include bin,obj -recurse | remove-item -force -recurse
考虑到我在这里查找时没有找到答案,所以我想分享一下。
-WhatIf
标志进行测试,所以最终得到了这个命令:$foldersToRemove='bin','obj';[string[]]$foldersToIgnore='ThirdParty';Get-ChildItem .\ -Include $foldersToRemove -Recurse|Where-Object{$_.FullName -inotmatch "\\$($foldersToIgnore -join '|')\\"}|Remove-Item -Force -Recurse -WhatIf
(虽然有点凌乱,但这是一个命令)。 - Johny Skovdalgci -exclude "*.dll" -include bin,obj -recurse | remove-item -force -recurse
- Ottxr$FoldersToRemove
变量定义中添加 $_ -notmatch 'node_modules'
条件。 - Tomino我过去总是在我的解决方案中添加一个新的目标来实现这一点。
<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
对于我来说,没有任何方法有效。我需要删除debug和release文件夹中的所有文件。我的解决方法:
1.右键点击项目,卸载,再次右键点击编辑,滚动到底部
2.插入
<Target Name="DeleteBinObjFolders" BeforeTargets="Clean">
<RemoveDir Directories="..\..\Publish" />
<RemoveDir Directories=".\bin" />
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>
3. 保存,重新加载项目,右键单击清理即可。
注意:这是一个旧的答案,可能需要为VS 2019和一些对象工件进行微调才能适应新版本。在使用此方法之前,请确保VS不需要目标和输出目录中的任何内容才能成功构建。
在清理目标后,类似下面的内容就可以以相当优雅的方式实现:
<Target Name="RemoveObjAndBin" AfterTargets="Clean">
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
<RemoveDir Directories="$(TargetDir)" />
</Target>
一个非常快速且无痛的方法是使用 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
命令。在此由@Shaman解释得非常清楚:https://dev59.com/qnRA5IYBdhLWcg3w_DHF#22306653rm -rf **/bin **/obj
可以实现同样的功能。然而,有一点值得提醒的是,如果你的项目存在于更深层级的子目录中,这两种解决方案都无法删除这些项目的 bin/obj 目录。因此,这个解决方案适用于大多数情况,但不是所有情况。 - shukebeta<Target Name="BeforeBuild">
<!-- Remove obj folder -->
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
<!-- Remove bin folder -->
<RemoveDir Directories="$(BaseOutputPath)" />
</Target>
以下是文章:如何在构建或部署之前删除bin和/或obj文件夹
这非常类似于Steve的PowerShell脚本。我只是在其中添加了TestResults和packages,因为它对大多数项目都是必需的。
Get-ChildItem .\ -include bin,obj,packages,TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }