删除 C 盘空文件夹--递归删除

打印 上一主题 下一主题

主题 760|帖子 760|积分 2280

  1. # Language: Powershell
  2. # Style: TypeScript
  3. # 文件名:
  4. # "文件(夹):删除空文件夹.ps1"
  5. function Remove-EmptyDirectories {
  6.         param (
  7.                 [string]$Path
  8.         )
  9.         # 获取所有目录,把子目录排列在父目录前面。
  10.         # 删除所有子文件(夹)后,可判断父目录为空,进而再删除父目录。
  11.         $directories = Get-ChildItem $Path -Recurse -Directory | Sort-Object -Property FullName -Descending
  12.         foreach ($dir in $directories) {
  13.                 # 检查目录是否为空(排除 desktop.ini)
  14.                 if (-not (Get-ChildItem $dir.FullName -Recurse) -and
  15.                     -not (Test-Path (Join-Path $dir.FullName "desktop.ini"))) {
  16.                         # 检查目录属性,排除具有系统、只读和重分析点属性的目录
  17.                         $attributes = (Get-Item $dir.FullName).Attributes
  18.                         if (-not ($attributes -band [System.IO.FileAttributes]::System) -and
  19.                             -not ($attributes -band [System.IO.FileAttributes]::ReadOnly) -and
  20.                                 -not ($attributes -band [System.IO.FileAttributes]::ReparsePoint)) {
  21.                                         Remove-Item $dir.FullName -Force -Verbose
  22.                         }
  23.                 }
  24.         }
  25. }
  26. function main {
  27.         if ($args.Count -gt 0) {
  28.                         Remove-EmptyDirectories $($args[0])
  29.         } else {
  30.                         Write-Host "No arguments provided."
  31.         }
  32. }
  33. main $args
  34. # Usage:
  35. # PowerShell.exe -File "文件(夹):删除空文件夹.ps1" "C:"
  36. <#
  37. # 无回溯,只删除了叶子空目录
  38. Get-ChildItem "C:" -Recurse | Where-Object { $_.PSIsContainer -and @(Get-ChildItem $_.FullName -Recurse).Count -eq 0 } | Remove-Item
  39. #>
复制代码
  1. :: Language: cmd
  2. :: Style: Cobol
  3. :: 使用方法: "你命名的脚本.bat" "C:"
  4. :DelEmptyDir
  5. @        echo off&pushd "%TEMP%"&setlocal EnableDelayedExpansion
  6.         @if not exist "%~1" exit /b 0
  7.         REM 设置要清理的路径
  8.         set "targetPath=%~1"
  9.         REM 遍历所有目录
  10.         for /f "delims=" %%D in ('dir "%targetPath%" /s/b/ad ^| sort /r') do (
  11.                 set "dirPath=%%D"
  12.                 REM 检查目录是否为空
  13.                 set isEmpty=1
  14.                 dir /a/b "!dirPath!" | findstr .* >nul && set isEmpty=0
  15.                 REM 检查是否包含 desktop.ini 文件
  16.                 if exist "!dirPath!\desktop.ini" set isEmpty=0
  17.                 REM 检查目录属性
  18.                 for %%A in ("!dirPath!") do (
  19.                         set "attr=%%~aA"
  20.                         echo !attr! | find "R" >nul && set isReadOnly=1 || set isReadOnly=0
  21.                         echo !attr! | find "S" >nul && set isSystem=1 || set isSystem=0
  22.                         echo !attr! | find "L" >nul && set isReparsePoint=1 || set isReparsePoint=0
  23.                 )
  24.                 REM 如果目录为空且不包含特定属性或文件,则删除
  25.                 if "!isEmpty!"=="1" if "!isReadOnly!"=="0" if "!isSystem!"=="0" if "!isReparsePoint!"=="0" (
  26.                         echo Deleting empty directory: "!dirPath!"
  27.                         rd "!dirPath!" >nul 2>&1
  28.                 )
  29.         )
  30. @        endlocal & popd
  31. @exit /b 0
复制代码

不想麻烦,本想网上找一个简朴脚了事,没想太多照搬的,而且还错的离谱。只好本身搞个。

# 利用 Powershell 语言

function Remove-EmptyDirectories {
    param (
        [string]$Path
    )
    # 获取全部目录,把子目录排列在父目录前面。
    # 删除全部子文件(夹)后,可判定父目录为空,进而再删除父目录。
    $directories = Get-ChildItem $Path -Recurse -Directory | Sort-Object -Property FullName -Descending
    foreach ($dir in $directories) {
        # 查抄目录是否为空(扫除 desktop.ini)
        if (-not (Get-ChildItem $dir.FullName -Recurse) -and 
            -not (Test-Path (Join-Path $dir.FullName "desktop.ini"))) {
            # 查抄目录属性,扫除具有体系、只读和重分析点属性的目录
            $attributes = (Get-Item $dir.FullName).Attributes
            if (-not ($attributes -band [System.IO.FileAttributes]::System) -and
                -not ($attributes -band [System.IO.FileAttributes]::ReadOnly) -and
                -not ($attributes -band [System.IO.FileAttributes]::ReparsePoint)) {
                    Remove-Item $dir.FullName -Force -Verbose
            }
        }
    }
}
function main {
    if ($args.Count -gt 0) {
            Remove-EmptyDirectories $($args[0])
    } else {
            Write-Host "No arguments provided."
    }
}
main $args
# PowerShell.exe -File "文件(夹):删除空文件夹.ps1" "C:\"
<#
 # 无回溯,只删除了叶子空目录
Get-ChildItem "C:\" -Recurse | Where-Object { $_.PSIsContainer -and @(Get-ChildItem $_.FullName -Recurse).Count -eq 0 } | Remove-Item
#>

:: ---------------------------------------------------------------------------------------------------------------------------
利用 CMD 命令:

elEmptyDir
@    echo off&pushd "%TEMP%"&setlocal EnableDelayedExpansion
    @if not exist "%~1\" exit /b 0
    REM 设置要清理的路径
    set "targetPath=%~1"
    REM 遍历全部目录
    for /f "delims=" %%D in ('dir "%targetPath%" /s/b/ad ^| sort /r') do (
        set "dirPath=%%D"
        REM 查抄目录是否为空
        set isEmpty=1
        dir /a/b "!dirPath!" | findstr .* >nul && set isEmpty=0
        REM 查抄是否包罗 desktop.ini 文件
        if exist "!dirPath!\desktop.ini" set isEmpty=0
        REM 查抄目录属性
        for %%A in ("!dirPath!") do (
            set "attr=%%~aA"
            echo !attr! | find "R" >nul && set isReadOnly=1 || set isReadOnly=0
            echo !attr! | find "S" >nul && set isSystem=1 || set isSystem=0
            echo !attr! | find "L" >nul && set isReparsePoint=1 || set isReparsePoint=0
        )
        REM 如果目录为空且不包罗特定属性或文件,则删除
        if "!isEmpty!"=="1" if "!isReadOnly!"=="0" if "!isSystem!"=="0" if "!isReparsePoint!"=="0" (
            echo Deleting empty directory: "!dirPath!"
            rd "!dirPath!" >nul 2>&1
        )
    )
@    endlocal & popd
@exit /b 0
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表