使用批处理文件删除所有子文件夹?

使用批处理文件删除所有子文件夹?

要从当前路径中删除所有bin以任何子文件夹为根的文件夹,我有以下脚本,这是我尝试过的(就我对批处理脚本的了解而言):

setlocal enabledelayedexpansion
for /f %%i in ('dir /a:d /s /b *') 
do 
(
  set d=!i!\bin 
  if exist !d! rd !d!
)
endlocal

它不起作用,甚至看起来还有一些语法错误。但找出它是什么很麻烦。当我从 运行批处理文件时cmd,它显示以下内容:

/s was unexpected at this time.

请注意,为了运行该批处理文件cmd,我必须将其更改为%%%否则它会抱怨

The syntax of the command is incorrect.

所以,如果我们想从 运行批处理文件cmd,我们需要先用 替换所有,%%这太荒谬了%?真的吗:D 如果直接运行批处理文件(通过双击它),控制台窗口会立即关闭,而我没有任何机会查看哪里出了问题。我甚至尝试PAUSE在末尾放一个,以便它可以暂停,但它也不起作用(我知道在此之前有一些错误导致暂停也不起作用)。

回到我最初的问题,因为我不知道这里出了什么问题(根据报告的消息cmd),我真的被困住了。希望你们能在我的脚本中找出错误并帮助我修复它。

答案1

你可以试试:
@echo off 

cd/d "%~dp0"

for /f delims^= %%i in (
  'dir /a:d/s/b ^| findstr /eil "\bin \obj"'
  )do echo; rd "%%~i"


  • 观察:1它的语法倾向于服务于其他语言,但不服务于 bat/cmd 脚本,这个循环不能以那种方式工作......

    for /f %%i in ('loop command') 
    do 
    (
       // dynamic variable %%i can be expanded, that 
       // doesn't mean it will be treated/expanded 
       // like a regular variable %i% at runtime !i!
    )
    

    该命令的语法不正确。


  • 观察:2该代码会在屏幕上列出结果,echo;如果输出看起来正确,则运行/删除文件夹

其他资源:

答案2

使用 PowerShell,因为它比 cmd 功能强大得多。

您需要安装PowerShell 7,那么你可能还想安装Windows 终端,如果您不知道如何安装和打开它们,网上有大量的教程可以比我更好地解释这个过程,所以我就不再重复了。

pwsh.exe以管理员权限运行:

Win+ R-> 类型pwsh.exe- Ctrl> Shift++Enter

然后,在控制台中获取“Path\to\folder”内的所有项目:

Get-ChildItem -Path "Path\to\folder" -Force -Recurse

仅列出子目录:

Get-ChildItem -Path "Path\to\folder" -Force -Recurse -Directory

根据模式过滤第一个命令的输出:

Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' }

删除链中前一个链接过滤的所有项目:

Get-ChildItem -Path "Path\to\folder" -Force -Recurse | Where-Object {$_.Name -match 'bin|obj' } | Remove-Item -Recurse -Force -Confirm:$false

上面的代码实现了你想要的功能,path\to\folder 是一个占位符,将其更改为实际(绝对)路径,例如,如果路径是“D:\MyFolder”,则将其更改为“D:\MyFolder”,'bin|obj' 是一个正则表达式,如果你需要其他模式,请将其替换为你需要的模式,要构造模式,只需使用垂直管道连接选项即可。将路径和模式括在引号中。

警告:上述操作会自动删除所有正确指定的内容而无需确认提示,如果您没有准备好,请不要运行它。

现在让我们来简化一下整个事情:

gci "Path\to\folder" -Fo -R | % {$_.Name -match 'bin|obj' } | ri -R -Fo -Con:$false

将代码包含在函数中以提高可重用性:

function remove-filtered ($path, $pattern) {
    Get-ChildItem -Path $path -Force -Recurse | Where-Object {$_.Name -match $pattern } | Remove-Item -Recurse -Force -Confirm:$false
}

相关内容